Вопрос проверяет понимание принципов ООП в Go, в частности, как язык реализует механизм ограничения доступа к данным и методам.
Инкапсуляция в Go достигается за счет использования регистра символов в именах. Имена, начинающиеся с заглавной буквы, доступны вне пакета (публичные). Имена, начинающиеся с маленькой буквы, видимы только внутри того же пакета (приватные).
1. Основы инкапсуляции в Go:
Go не использует ключевые слова private или protected для ограничения доступа.
Доступность определяет регистр:
Заглавная буква: экспортируемые элементы (public).
Строчная буква: элементы остаются приватными для пакета.
2. Пример кода:
package main
import "fmt"
// Экспортируемая структура
type Person struct {
Name string // Публичное поле
age int // Приватное поле
}
// Публичный метод
func (p *Person) SetAge(age int) {
if age > 0 {
p.age = age
}
}
// Приватный метод
func (p *Person) getAge() int {
return p.age
}
func main() {
p := Person{Name: "Alice"}
p.SetAge(30)
fmt.Println("Name:", p.Name)
// fmt.Println("Age:", p.getAge()) // Ошибка: метод приватный
}
3. Ограничения инкапсуляции в Go:
Нет механизма для ограничения доступа на уровне объекта (все данные приватны или доступны всему пакету).
Поля структуры и методы инкапсулируются на уровне пакета.
4. В каких случаях использовать:
Когда нужно ограничить доступ к полям/методам структуры из других пакетов.
Для контроля над изменением внутренних данных через геттеры/сеттеры.
При проектировании библиотек с четко определенными интерфейсами.