Skip to content

Files

Latest commit

a60a6b5 · Apr 28, 2023

History

History

sub5

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Apr 28, 2023

10.7.5. Внутренние пакеты

Пакет является наиболее важным механизмом инкапсуляции в программах 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, предоставив его "на испытательный срок" узкому кругу клиентов.
  • Использование внутренних пакетов позволяет более гибко и безопасно управлять доступом к коду проекта.
  • Внутренние пакеты помогают избежать конфликтов имен и запутанности в коде проекта.
  • Внутренние пакеты - это один из способов обеспечения безопасности и структурирования кода в больших проектах.