Как инкапсуляция осуществлена в 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