Найти в Дзене
Skill Up In IT

Golang ООП

Хотя GoLang не является классическим ООП-языком, он поддерживает основные принципы ООП: инкапсуляцию, наследование (через композицию) и полиморфизм. Рассмотрим каждый из них. Инкапсуляция — это сокрытие внутренней реализации объекта и предоставление только необходимого интерфейса для взаимодействия с ним. В GoLang инкапсуляция достигается за счет использования заглавных и строчных букв в именах полей и методов: Пример: go: package main import "fmt" type Person struct { name string // приватное поле Age int // публичное поле } // Публичный метод func (p *Person) SetName(name string) { p.name = name } // Приватный метод func (p *Person) getName() string { return p.name } func main() { p := Person{Age: 30} p.SetName("John") fmt.Println(p.Age) // 30 // fmt.Println(p.getName()) // Ошибка: getName недоступен } В GoLang отсутствует классическое наследование, но его можно заменить композицией. Композиция позволяет включать одну структуру в другую, тем самым расширяя её
Оглавление

Объектно-ориентированное программирование в GoLang

Хотя GoLang не является классическим ООП-языком, он поддерживает основные принципы ООП: инкапсуляцию, наследование (через композицию) и полиморфизм. Рассмотрим каждый из них.

Инкапсуляция

Инкапсуляция — это сокрытие внутренней реализации объекта и предоставление только необходимого интерфейса для взаимодействия с ним. В GoLang инкапсуляция достигается за счет использования заглавных и строчных букв в именах полей и методов:

  • Поля и методы, начинающиеся с заглавной буквы, являются публичными (доступны из других пакетов).
  • Поля и методы, начинающиеся со строчной буквы, являются приватными (доступны только внутри пакета).

Пример:

go:

package main
import "fmt"
type Person struct {
name string // приватное поле
Age int // публичное поле
}
// Публичный метод
func (p *Person) SetName(name string) {
p.name = name
}
// Приватный метод
func (p *Person) getName() string {
return p.name
}
func main() {
p := Person{Age: 30}
p.SetName("John")
fmt.Println(p.Age) // 30
// fmt.Println(p.getName()) // Ошибка: getName недоступен
}

Наследование через композицию

В GoLang отсутствует классическое наследование, но его можно заменить композицией. Композиция позволяет включать одну структуру в другую, тем самым расширяя её функциональность.

Пример:

go:

package main
import "fmt"
type Animal struct {
Name string
}
func (a *Animal) Speak() {
fmt.Println(a.Name, "издает звук")
}
type Dog struct {
Animal // Встраивание структуры Animal
Breed string
}
func main() {
d := Dog{
Animal: Animal{Name: "Рекс"},
Breed: "Доберман"},
}
d.Speak() // Рекс издает звук
}

В этом примере структура Dog "наследует" метод Speak от структуры Animal.

Полиморфизм через интерфейсы

Полиморфизм в GoLang реализуется с помощью интерфейсов. Интерфейсы определяют набор методов, которые должны быть реализованы структурами. Это позволяет работать с разными типами через единый интерфейс.

Пример:

go:

package main
import "fmt"
type Speaker interface {
Speak()
}
type Dog struct {
Name string
}
func (d Dog) Speak() {
fmt.Println(d.Name, "гавкает")
}
type Cat struct {
Name string
}
func (c Cat) Speak() {
fmt.Println(c.Name, "мяукает")
}
func main() {
animals := []Speaker{
Dog{Name: "Рекс"},
Cat{Name: "Мурка"},
}
for _, animal := range animals {
animal.Speak()
}
}

В этом примере интерфейс Speaker позволяет вызывать метод Speak для разных типов (Dog и Cat).

Заключение

GoLang — это мощный инструмент, который, несмотря на отсутствие классических ООП-возможностей, позволяет эффективно реализовывать принципы объектно-ориентированного программирования. Благодаря композиции, интерфейсам и простоте синтаксиса, GoLang становится отличным выбором для современных разработчиков. Если вы ищете язык, который сочетает в себе производительность, простоту и гибкость, GoLang — это то, что вам нужно.