воскресенье, 2 июня 2019 г.

Спецификация Go: объявления и области видимости

Объявление (declaration) связывает непустой идентификатор с константой, типом, переменной, функцией, меткой (label) или пакетом. Каждый идентификатор в программе должен быть объявлен. Ни один идентификатор не может быть объявлен дважды в одном и том же блоке, и ни один идентификатор не может быть объявлен как в блоке файла, так и в блоке пакета.

Пустой идентификатор ( _ , знак нижнего подчеркивания) может использоваться как любой другой идентификатор в объявлении, но он не вводит привязку и, следовательно, не объявляется. В блоке пакета идентификатор init может использоваться только для объявлений функции init, и, подобно пустому идентификатору, он не вводит новую привязку.

Declaration   = ConstDecl | TypeDecl | VarDecl .
TopLevelDecl  = Declaration | FunctionDecl | MethodDecl .

Область видимости объявленного идентификатора - это объем исходного текста кода, в котором идентификатор обозначает указанную константу, тип, переменную, функцию, метку или пакет.

Go имеет лексическую область видимости, используя блоки:

  1. Область видимости предварительно объявленного идентификатора - это всеобщий блок (universe block).
  2. Область видимости идентификатора, обозначающего константу, тип, переменную или функцию (но не метод), объявленную на верхнем уровне (вне какой-либо функции), это блок пакета.
  3. Область видимости имени импортируемого пакета - это блок файла, содержащий объявление импорта.
  4. Область видимости идентификатора, обозначающего приемник метода (method receiver), параметра функции или переменной результата, это тело функции.
  5. Область видимости идентификатора константы или переменной, объявленного внутри функции, начинается в конце ConstSpec или VarSpec (ShortVarDecl для коротких объявлений переменных) и заканчивается в конце самого внутреннего содержащего блока.
  6. Область видимости идентификатора типа, объявленного внутри функции, начинается с идентификатора в TypeSpec и заканчивается в конце самого внутреннего содержащего блока.
  7. Идентификатор, объявленный в блоке, может быть повторно объявлен во внутреннем блоке. Пока идентификатор внутренней декларации находится в области видимости, он обозначает сущность, объявленную внутренней декларацией.

Границы пакета не являются декларацией; имя пакета не отображается ни в одной области видимости. Его цель - идентифицировать файлы, принадлежащие одному и тому же пакету, и указать имя пакета по умолчанию для объявлений импорта.

Области видимости меток (label)

Метки (labels) объявляются помеченными операторами (labeled statements) и используются в операторах "break", "continue" и "goto". Недопустимо определять метку, которая никогда не используется. В отличие от других идентификаторов, метки не имеют блочной области видимости и не конфликтуют с идентификаторами, которые не являются метками. Область видимости метки - это тело функции, в которой она объявлена, исключая тело любой вложенной функции.


Читайте также:


Комментариев нет:

Отправить комментарий