Ответ
В 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 работает на уровне пакетов, а не на уровне файлов или блоков кода, как в некоторых других языках.