Как в Go управлять видимостью (экспортом) переменных, функций и полей структур?

Ответ

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

  • Экспортируемый (публичный) идентификатор начинается с заглавной буквы. Он доступен из любого другого пакета, который импортирует данный пакет. (например, PublicVar, Calculate()).
  • Неэкспортируемый (приватный) идентификатор начинается со строчной буквы. Он доступен только внутри того же пакета, в котором определен. (например, privateVar, calculateInternal()).

Пример:

package user

// Экспортируемая структура, так как начинается с заглавной 'U'
type User struct {
    // Экспортируемое поле, доступно из других пакетов
    ID   int
    // Неэкспортируемое поле, доступно только внутри пакета 'user'
    email string
}

// Экспортируемая функция
func NewUser(id int, email string) *User {
    return &User{ID: id, email: email}
}

// Неэкспортируемая функция
func validateEmail(email string) bool {
    // ... логика валидации
    return true
}

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