РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
915 of 1593 menu

Внутренние пакеты internal

Внутренние пакеты internal в Go предоставляют механизм ограничения доступа к пакетам. Пакет с именем internal может импортироваться только из пакетов, находящихся в пределах родительской директории этого internal пакета. Это позволяет разработчикам скрывать внутреннюю реализацию и предотвращать использование кода за пределами своего модуля.

Синтаксис и структура

Для создания внутреннего пакета необходимо создать директорию internal на нужном уровне иерархии. Все пакеты внутри этой директории будут считаться внутренними и доступными только для импорта из пакетов, которые находятся в той же или дочерних директориях относительно internal.

Пример

Давайте создадим структуру проекта с внутренним пакетом:

myproject/ ├── go.mod ├── main.go └── internal/ └── math/ └── math.go

Пример

Содержимое внутреннего пакета internal/math/math.go:

package math func Add(a, b int) int { return a + b } func Sub(a, b int) int { return a - b }

Пример

Использование внутреннего пакета из основного пакета main.go:

package main import ( "fmt" "myproject/internal/math" ) func main() { res := math.Add(10, 5) fmt.Println(res) }

Результат выполнения кода:

15

Пример

Попытка импорта внутреннего пакета из внешнего модуля приведет к ошибке компиляции. Например, если другой модуль попытается импортировать myproject/internal/math:

package external import "myproject/internal/math" // Ошибка: use of internal package not allowed

Пример

Внутренние пакеты можно использовать для организации утилит, которые используются только внутри модуля. Рассмотрим пример с несколькими внутренними пакетами:

myproject/ ├── go.mod ├── main.go ├── internal/ │ ├── math/ │ │ └── math.go │ └── helpers/ │ └── helpers.go └── pkg/ └── api/ └── api.go

Пакет pkg/api может импортировать внутренние пакеты, так как находится в том же модуле:

package api import ( "myproject/internal/math" "myproject/internal/helpers" ) func Calculate(a, b int) int { return math.Add(a, b) + helpers.SomeHelperFunc() }

Смотрите также

  • экспортированные идентификаторы exported,
    которые доступны из других пакетов
  • неэкспортированные идентификаторы unexported,
    которые доступны только внутри своего пакета
  • область видимости на уровне пакета package-scope,
    которая определяет доступность переменных и функций внутри пакета
  • область видимости на уровне файла file-scope,
    которая ограничивает доступность в пределах одного файла
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить