Неэкспортируемые идентификаторы
Неэкспортируемые идентификаторы в Go - это идентификаторы, которые начинаются со строчной буквы. Они доступны только внутри пакета, в котором объявлены. Это основное правило инкапсуляции в Go: все идентификаторы, начинающиеся с заглавной буквы, экспортируются, а со строчной - неэкспортируются.
Синтаксис
var unexportedVar int // неэкспортируемая переменная
type unexportedType struct {} // неэкспортируемый тип
func unexportedFunc() {} // неэкспортируемая функция
Пример
Давайте создадим неэкспортируемую переменную внутри пакета и попробуем обратиться к ней:
package main
import "fmt"
var internalValue int = 100
func main() {
internalValue = 200
fmt.Println(internalValue)
}
Результат выполнения кода:
200
Пример
Попробуем получить доступ к неэкспортируемой функции из другого пакета:
// В пакете example
package example
func unexportedHelper() string {
return "internal helper"
}
При попытке использования из другого пакета:
package main
import "example"
func main() {
result := example.unexportedHelper()
fmt.Println(result)
}
Результат выполнения кода:
"cannot refer to unexported name example.unexportedHelper"
Пример
Рассмотрим работу с неэкспортируемыми полями структуры:
package main
import "fmt"
type Person struct {
Name string // экспортируемое поле
age int // неэкспортируемое поле
}
func main() {
p := Person{Name: "John", age: 30}
fmt.Println(p.Name)
// fmt.Println(p.age) // ошибка: поле age не экспортируется
}
Результат выполнения кода:
"John"
Смотрите также
-
понятие
экспортируемых идентификаторов,
которые доступны за пределами пакета -
правила
области видимости на уровне пакета,
где действуют неэкспортируемые идентификаторы -
концепцию
блочной области видимости,
которая влияет на доступность идентификаторов -
механизм
затенения идентификаторов,
который может переопределять видимость переменных