Подтвердить что ты не робот

Общественный, Частный - Верхний корпус, Нижний регистр:

Новое для GoLang, поступающее из Delphi, С++:

В первый раз я попытался создать свой собственный пакет в Go, я выполнил все инструкции о том, как выложить рабочую область и т.д., но я продолжал получать ошибку компилятора:

./myPackage.go:52: undefined: myFunc

После нескольких минут я обнаружил, что модификатор открытого доступа в Go достигается просто объявлением функции в верхнем регистре. Отлично.

Но когда я начал экспериментировать с классами контейнеров - List для стартеров, я обнаружил, что мне нужно было объявить возвращаемое ссылочное значение List следующим образом:

func GetFactors(value *int64) *list.List {...

*list находится в нижнем регистре.

То же самое, когда я объявлял локальную ссылку на список - мне приходилось использовать:

l := list.New()

Снова нижний регистр для List.

Итак, я в замешательстве. Каково правило? Вызов списка и ссылки, очевидно, являются общедоступными, или я не смог бы их вызвать/использовать - так почему они в нижнем регистре?

4b9b3361

Ответ 1

В этом случае list - это имя пакета, который вы импортируете через import "container/list", а его общедоступные члены - в верхнем регистре, например list.

Правило гласит, что публичные функции, типы и т.д. должны быть в верхнем регистре.

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

Обновление: это не последняя часть пути пакета. Это фактическое имя пакета (которое часто одно и то же).

Ответ 2

Примечание: начиная Go 1.5 (Q2/Q3 2015), вы также получите "защищенный" импорт (с именем "internal" )!

Смотрите Go 1.4 doc:

Система пакетов Go позволяет легко структурировать программы в компоненты с чистыми границами, но есть только две формы доступа: локальная (не экспортированная) и глобальная (экспортированная).
Иногда хочется иметь компоненты, которые не экспортируются, например, чтобы избежать приобретения клиентов интерфейсов для кода, который является частью публичного репозитория, но не предназначен для использования вне программы, к которой он принадлежит.

Язык Go не имеет возможности принудительно применять это различие, но по команде Go 1.4 команда go вводит механизм определения "внутренних" пакетов, которые не могут быть импортированы пакетами вне исходного поддерева, в котором они находятся.

Чтобы создать такой пакет, поместите его в каталог с именем internal или в подкаталог каталога с именем internal.
Когда команда go видит импорт пакета с internal в своем пути, он проверяет, что пакет, выполняющий импорт, находится внутри дерева, корневого в родительском каталоге внутреннего каталога.
Например, пакет .../a/b/c/internal/d/e/f может быть импортирован только кодом в дереве каталогов, корневом в .../a/b/c.
Он не может быть импортирован кодом в .../a/b/g или в любом другом репозитории.

Для Go 1.4 механизм внутреннего пакета применяется для основного репозитория Go; от 1.5 и далее будет применяться для любого репозитория.

Ответ 3

Примечание. Go Spec для имени пакета не упоминает, что имя пакета всегда в нижнем регистре. Он только утверждает, что его имя представлено identifier, которое состоит из коллекции letter".

Этот поток разъясняет:

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

Экспорт в верхний/нижний регистр не имеет отношения к пакетам, поскольку у вас нет личного пакета.

Как только вы это знаете, легче распознать:

  • list.New() для конструктора (всегда на уровне пакета, чтобы создать инициализированный экземпляр типа), например os.NewFile(),
  • list.List для тип структуры список пакетов (другой тип структуры этого же пакета list.Element).