Как в Go реализуется инкапсуляция на уровне пакетов? Что такое экспортируемые и неэкспортируемые идентификаторы?

Ответ

В Go инкапсуляция и управление видимостью реализованы на уровне пакетов и контролируются регистром первой буквы идентификатора (имени переменной, функции, типа или константы).


  • Экспортируемый (публичный) идентификатор

    Начинается с заглавной буквы (например, PublicVar, DoSomething). Он доступен из любого другого пакета, который импортирует данный пакет.



  • Неэкспортируемый (приватный) идентификатор

    Начинается со строчной буквы (например, privateVar, doSomething). Он доступен только внутри того пакета, в котором был объявлен. Попытка обратиться к нему из другого пакета приведёт к ошибке компиляции.


Это основной механизм Go для сокрытия деталей реализации и предоставления чистого API пакета.

Пример:

// Файл: mypackage/vars.go
package mypackage

// PublicVar доступна из других пакетов
var PublicVar string = "Это публичная переменная"

// privateVar доступна только внутри пакета mypackage
var privateVar int = 42
// Файл: main.go
package main

import (
    "fmt"
    "example.com/mypackage" // Импортируем наш пакет
)

func main() {
    // Корректно: обращаемся к экспортируемой переменной
    fmt.Println(mypackage.PublicVar)

    // Ошибка компиляции: mypackage.privateVar is not exported
    // fmt.Println(mypackage.privateVar)
}