Область видимости файла

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

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

Синтаксис

gopackage main

const localConst = "only in this file"
var localVar int
type localType struct{}
func localFunc() {}

В приведенном примере все идентификаторы имеют область видимости файла, поскольку они объявлены с маленькой буквы и находятся на уровне пакета.

Пример

Давайте создадим файл <main.go> с неэкспортируемой переменной и функцией:

gopackage main

import "fmt"

var fileScopedVar = "I am visible only in this file"

func fileScopedFunc() string {
  return "Hello from file scope"
}

func main() {
  fmt.Println(fileScopedVar)
  fmt.Println(fileScopedFunc())
}

Результат выполнения кода:

go"I am visible only in this file"
"Hello from file scope"

Пример

Теперь попробуем использовать те же идентификаторы из другого файла того же пакета (<helper.go>):

gopackage main

func helperFunc() {
  // fileScopedVar и fileScopedFunc не видны здесь
  // Это вызовет ошибку компиляции
}

При попытке скомпилировать проект с двумя файлами возникнет ошибка, так как <fileScopedVar> и <fileScopedFunc> не видны в <helper.go>.

Пример

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

gopackage main

import "fmt"

var ExportedVar = "I am visible in all package files"

func ExportedFunc() string {
  return "Visible everywhere"
}

func main() {
  fmt.Println(ExportedVar)
  fmt.Println(ExportedFunc())
}

Теперь эти идентификаторы имеют область видимости пакета и доступны из любого файла пакета.

Смотрите также