Ответ
В 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.
Ответ 18+ 🔞
Так, слушай, а вот в Go, блядь, этой вашей, нету этих ваших public и private, как у нормальных людей! Всё проще, сука, до безобразия. Всё решает одна буква, первая, блядь, в названии.
Правило, ёпта, элементарное:
- Видно всем, как сраный фонарь на площади: Если имя начинается с БОЛЬШОЙ буквы — типа
PublicVar,MyFunction— то это экспорт, детка. Любой другой пакет, который тебя импортирует, может на это смотреть и трогать. Публичное достояние, блядь. - Спрятано, как последняя бутылка от соседа: Если имя со строчной буквы —
privateVar,myFunction— то это твоё личное, внутреннее дело. Доступно только внутри этого же самого пакета. Соседний пакет обосрётся, но не увидит. Инкапсуляция, ёбана!
Смотри, как это выглядит в коде:
package mypackage
// PublicVar - вот эта штука торчит наружу, как хуй из штанов.
var PublicVar string = "I'm public!"
// privateVar - а эта — только для внутреннего пользования, в своём кругу.
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 инкапсуляция работает на уровне пакетов, а не этих ваших классов. Просто, как три копейки, но работает, блядь, на ура. Спрятал внутреннюю кухню — выдал наружу красивый фасад. Всё гениальное — просто, в рот меня чих-пых!