Как инкапсуляция осуществлена в Golang
Инкапсуляция реализована через организацию доступа к полям и методам структур с помощью видимости. Используется механизм экспорта и неэкспорта имен (экспортируемые и неэкспортируемые элементы). Экспортируемые элементы доступны из других пакетов, а неэкспортируемые — только внутри того же пакета.
Экспортируемые и неэкспортируемые элементы
- Имена, начинающиеся с заглавной буквы, экспортируются и видны из других пакетов.
- Имена, начинающиеся с прописной буквы, не экспортируются и доступны только внутри текущего пакета.
Пример инкапсуляции
Определение структуры с экспортируемыми и неэкспортируемыми полями
```go
package main
import (
"fmt"
)
// Person структура с экспортируемыми и неэкспортируемыми полями
type Person struct {
Name string // Экспортируемое поле
age int // Неэкспортируемое поле
}
// Метод для получения возраста (экспортируемый)
func (p *Person) GetAge() int {
return p.age
}
// Метод для установки возраста (экспортируемый)
func (p *Person) SetAge(age int) {
if age >= 0 {
p.age = age
}
}
func main() {
// Создание экземпляра структуры
person := Person{Name: "Alice"}
// Доступ к экспортируемому полю
fmt.Println("Name:", person.Name)
// Установка и получение значения через методы
person.SetAge(30)
fmt.Println("Age:", person.GetAge())
}
```
В этом примере структура `Person` имеет экспортируемое поле `Name` и неэкспортируемое поле `age`. Методы `GetAge` и `SetAge` позволяют управлять доступом к полю `age`.
Попробуем обратиться к полю `age` из другого пакета:
Пакет main.go
```go
package main
import (
"fmt"
"mypackage"
)
func main() {
person := mypackage.NewPerson("Bob", 25)
// Доступ к экспортируемому полю
fmt.Println("Name:", person.Name)
// Попытка доступа к неэкспортируемому полю приведет к ошибке компиляции
// fmt.Println("Age:", person.age)
// Использование методов для доступа к неэкспортируемому полю
fmt.Println("Age:", person.GetAge())
}
```
Пакет mypackage/person.go
```go
package mypackage
// Person структура с экспортируемыми и неэкспортируемыми полями
type Person struct {
Name string // Экспортируемое поле
age int // Неэкспортируемое поле
}
// NewPerson конструктор для создания новой структуры Person
func NewPerson(name string, age int) *Person {
return &Person{Name: name, age: age}
}
// Метод для получения возраста (экспортируемый)
func (p *Person) GetAge() int {
return p.age
}
// Метод для установки возраста (экспортируемый)
func (p *Person) SetAge(age int) {
if age >= 0 {
p.age = age
}
}
```
В данном примере пакет `mypackage` определяет структуру `Person` и функции для работы с неэкспортируемым полем `age`. Пакет `main` использует эти функции для управления доступом к полю `age`.
Инкапсуляция достигается с помощью разграничения доступа к полям и методам через механизм видимости: имена с заглавной буквы экспортируются и доступны из других пакетов, а с прописной буквы — нет. Управление доступом к полям осуществляется через методы.
May 23, 2024, easyoffer