Перейти к содержимому
13 / 15

Пакеты и видимость: экспорт по регистру, internal и циклические импорты

Видимость в Go определяется регистром первой буквы: идентификатор с заглавной экспортируется из пакета, со строчной — виден только внутри него. Никаких public и private нет, и это относится и к полям структур, и к методам, и к константам. Единица инкапсуляции — пакет, а не файл: все файлы одного пакета видят друг у друга всё. Есть один особый каталог: internal — пакеты внутри него импортируются только из поддерева, в котором лежит родитель internal, и компилятор это проверяет. Это единственный способ в Go объявить «публично внутри модуля, но не наружу». Циклические импорты запрещены и обнаруживаются компилятором: два пакета не могут ссылаться друг на друга. Лечится это не хитростями, а перепроектированием — обычно выносом общих типов в третий пакет или, чаще, объявлением интерфейса у потребителя, чтобы зависимость развернулась в одну сторону.

Пакеты и видимость: экспорт по регистру, internal и циклические импорты | JScriptiser