Неэкспортируемые идентификаторы

Неэкспортируемые идентификаторы в Go - это идентификаторы, которые начинаются со строчной буквы. Они доступны только внутри пакета, в котором объявлены. Это основное правило инкапсуляции в Go: все идентификаторы, начинающиеся с заглавной буквы, экспортируются, а со строчной - неэкспортируются.

Синтаксис

govar unexportedVar int     // неэкспортируемая переменная
type unexportedType struct {} // неэкспортируемый тип
func unexportedFunc() {}    // неэкспортируемая функция

Пример

Давайте создадим неэкспортируемую переменную внутри пакета и попробуем обратиться к ней:

gopackage main

import "fmt"

var internalValue int = 100

func main() {
  internalValue = 200
  fmt.Println(internalValue)
}

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

go200

Пример

Попробуем получить доступ к неэкспортируемой функции из другого пакета:

go// В пакете example
package example

func unexportedHelper() string {
  return "internal helper"
}

При попытке использования из другого пакета:

gopackage main

import "example"

func main() {
  result := example.unexportedHelper()
  fmt.Println(result)
}

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

go"cannot refer to unexported name example.unexportedHelper"

Пример

Рассмотрим работу с неэкспортируемыми полями структуры:

gopackage 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 не экспортируется
}

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

go"John"

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