Видимость на уровне пакета

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

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

Синтаксис объявления на уровне пакета

gopackage main

var packageVar int     // переменная уровня пакета
const packageConst = 100   // константа уровня пакета
type PackageType struct {} // тип уровня пакета
func packageFunc() {}    // функция уровня пакета

Пример

Объявим переменную уровня пакета и используем ее в функции main:

gopackage main

import "fmt"

var counter int = 0

func increment() {
  counter++
}

func main() {
  fmt.Println(counter) // 0
  increment()
  fmt.Println(counter) // 1
}

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

go0
1

Пример

Объявим константу и тип уровня пакета. Константа будет доступна во всех функциях пакета, а тип можно использовать для создания переменных:

gopackage main

import "fmt"

const version = "v1.0.0"

type User struct {
  Name string
  Age  int
}

func main() {
  fmt.Println("Version:", version)

  u := User{Name: "Alice", Age: 30}
  fmt.Printf("User: %+v\n", u)
}

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

go"Version: v1.0.0"
"User: {Name:Alice Age:30}"

Пример

Идентификаторы уровня пакета могут быть использованы в разных файлах одного пакета. Например, переменная sharedVar объявлена в файле a.go и используется в файле b.go:

go// a.go
package main

var sharedVar string = "Hello from package scope"
go// b.go
package main

import "fmt"

func main() {
  fmt.Println(sharedVar)
}

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

go"Hello from package scope"

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