Пакет является наиболее важным механизмом инкапсуляции
в программах Go. Неэкспортируемые идентификаторы
видимы
только в пределах одного пакета, а экспортируемые
— видимы всем.
Впрочем, иногда полезна золотая середина — способ определения идентификаторов, которые являются видимыми для небольшого набора доверенных пакетов, но не для всех. Например, разбивая большой пакет на более управляемые меньшие части, мы можем не захотеть раскрывать интерфейсы между этими частями для других пакетов. Или мы можем захотеть совместно использовать несколько вспомогательных функций несколькими пакетами проекта без их общедоступности. Или, возможно, мы просто хотим поэкспериментировать с новым пакетом без преждевременной фиксации его API, предоставив его "на испытательный срок" узкому кругу клиентов.
Для удовлетворения этих потребностей инструмент go build
рассматривает пакет особым образом, если его путь импорта
содержит часть с именем internal
. Такие пакеты называются внутренними пакетами
. Внутренний пакет
может быть
импортирован только другим пакетом, находящимся в дереве с корнем в родительском по отношению к internal
каталоге.
Например, для приведенных ниже пакетов net/http/internal/chunked
может быть импортирован из net/http/httputil
или
net/http
, но не из net/url
. Однако net/url
может импортировать net/http/httputil
:
net/http
net/http/internal/chunked
net/http/httputil
net/url
- Пакеты являются важным механизмом
инкапсуляции
в Golang. Неэкспортируемые идентификаторы
видимы только в пределах одного пакета, аэкспортируемые
- видимы всем.- Для определения идентификаторов, которые являются видимыми только для небольшого набора доверенных пакетов, можно
использовать
внутренние пакеты
. Внутренний пакет
(internal
) может быть импортирован только другим пакетом, находящимся в дереве с корнем в родительском по отношению кinternal
каталоге.- Разбивая большой пакет на более управляемые меньшие части, можно не захотеть раскрывать интерфейсы между этими частями для других пакетов, для этой задачи подойдет применение внутреннего пакета.
- Совместное использование вспомогательных функций несколькими пакетами проекта без их общедоступности может быть
достигнуто через
внутренние пакеты
. Внутренние пакеты
могут использоваться для экспериментирования с новым пакетом без преждевременной фиксации его API, предоставив его "на испытательный срок" узкому кругу клиентов.- Использование
внутренних пакетов
позволяет более гибко и безопасно управлять доступом к коду проекта. Внутренние пакеты
помогают избежать конфликтов имен и запутанности в коде проекта.Внутренние пакеты
- это один из способов обеспечения безопасности и структурирования кода в больших проектах.