Область видимости файла
Область видимости файла в Go определяет, какие идентификаторы доступны в пределах одного файла с исходным кодом. Эта область действует для объявлений, которые находятся на уровне пакета, но не экспортируются (не начинаются с заглавной буквы). Идентификаторы с областью видимости файла видны только в том файле, где они объявлены, и не доступны в других файлах того же пакета.
В первую очередь это касается неэкспортируемых констант, переменных, типов и функций, объявленных на уровне пакета. Если такое объявление используется только внутри одного файла, оно не будет видно в других файлах пакета, даже если они находятся в той же директории.
Синтаксис
package main
const localConst = "only in this file"
var localVar int
type localType struct{}
func localFunc() {}
В приведенном примере все идентификаторы имеют область видимости файла, поскольку они объявлены с маленькой буквы и находятся на уровне пакета.
Пример
Давайте создадим файл <main.go> с неэкспортируемой переменной и функцией:
package 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())
}
Результат выполнения кода:
"I am visible only in this file"
"Hello from file scope"
Пример
Теперь попробуем использовать те же идентификаторы из другого файла того же пакета (<helper.go>):
package main
func helperFunc() {
// fileScopedVar и fileScopedFunc не видны здесь
// Это вызовет ошибку компиляции
}
При попытке скомпилировать проект с двумя файлами возникнет ошибка,
так как <fileScopedVar> и <fileScopedFunc> не видны в <helper.go>.
Пример
Чтобы исправить ситуацию, нужно экспортировать идентификаторы, сделав их видимыми для всего пакета (с заглавной буквы), либо вынести общие объявления в отдельный файл:
package 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())
}
Теперь эти идентификаторы имеют область видимости пакета и доступны из любого файла пакета.
Смотрите также
-
понятие
области видимости пакета,
которая делает идентификаторы доступными во всех файлах пакета -
правила
экспортирования идентификаторов,
которые делают их видимыми за пределами пакета -
механизм
затенения переменных,
который может переопределять область видимости внутри вложенных блоков -
особенности
блочной области видимости,
которая ограничивает идентификаторы фигурными скобками