Ответ
В Go нет ключевых слов public
или private
, как в других языках. Видимость (инкапсуляция) определяется на уровне пакета и управляется регистром первой буквы идентификатора (имени переменной, функции, типа или поля структуры).
Правило очень простое:
- Экспортируемый (публичный) идентификатор: Имя начинается с заглавной буквы (например,
PublicVar
,MyFunction
). Он доступен из любого другого пакета, который импортирует данный пакет. - Неэкспортируемый (приватный) идентификатор: Имя начинается со строчной буквы (например,
privateVar
,myFunction
). Он доступен только в пределах того же пакета, в котором определен.
Пример
package mypackage
// PublicVar - экспортируемая переменная, доступна из других пакетов.
var PublicVar string = "I'm public!"
// privateVar - неэкспортируемая переменная, доступна только внутри mypackage.
var privateVar string = "I'm private to mypackage."
// MyStruct - экспортируемый тип структуры.
type MyStruct struct {
// PublicField - экспортируемое поле.
PublicField int
// privateField - неэкспортируемое поле.
privateField string
}
// PublicFunc - экспортируемая функция.
func PublicFunc() string {
return "You can call me from anywhere."
}
// privateFunc - неэкспортируемая функция.
func privateFunc() string {
return "You can only call me from within mypackage."
}
Ключевая идея заключается в том, что инкапсуляция в Go работает на уровне пакетов, а не классов или файлов. Это простой, но мощный механизм для сокрытия внутренней реализации и предоставления чистого публичного API.