Ответ
Для Go-разработчика ключевыми являются следующие концепции:
1. Инкапсуляция
Принцип: Сокрытие деталей реализации объекта и предоставление публичного интерфейса для взаимодействия с ним.
В Go: Реализуется на уровне пакетов. Типы, переменные, функции и методы, начинающиеся с заглавной буквы, экспортируются (публичны). Те, что начинаются со строчной буквы, остаются приватными в пределах пакета.
2. Композиция вместо наследования
Принцип: Go осознанно избегает классического наследования. Вместо этого поощряется композиция — включение одного типа в другой.
В Go: Это достигается через встраивание (embedding) структур. Встроенный тип делегирует свои поля и методы родительской структуре.
type Engine struct { Power int }
func (e *Engine) Start() { fmt.Println("Engine started") }
type Car struct {
Engine // Встраивание
Wheels int
}
// c := Car{}
// c.Start() // Метод Start() доступен напрямую
3. Полиморфизм через интерфейсы
Принцип: Возможность работать с объектами разных типов через единый интерфейс.
В Go: Полиморфизм достигается с помощью интерфейсов. Любой тип, реализующий все методы интерфейса, неявно удовлетворяет этому интерфейсу. Это называется "утиной типизацией" (duck typing).
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }
type Cat struct{}
func (c Cat) Speak() string { return "Meow!" }
func MakeSound(s Speaker) {
fmt.Println(s.Speak())
}
4. Конкурентность (Concurrency)
Принцип: Структурирование программы для выполнения нескольких задач одновременно, но не обязательно параллельно. Go предоставляет мощные встроенные инструменты для этого.
В Go: Горутины (goroutines) — легковесные потоки, и каналы (channels) — типизированные конвейеры для безопасной коммуникации между горутинами.
ch := make(chan string)
go func() {
ch <- "Hello from goroutine!"
}()
msg := <-ch // Ожидание и получение данных из канала
fmt.Println(msg)
5. Принципы проектирования
- SOLID: Набор из пяти принципов для создания поддерживаемого и расширяемого ПО.
- Single Responsibility Principle (Принцип единственной ответственности)
- Open/Closed Principle (Принцип открытости/закрытости)
- Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
- Interface Segregation Principle (Принцип разделения интерфейса)
- Dependency Inversion Principle (Принцип инверсии зависимостей)
- DRY (Don't Repeat Yourself): Избегание дублирования кода путем его абстрагирования и переиспользования.
- KISS (Keep It Simple, Stupid): Простота является ключевой целью дизайна. Следует избегать ненужной сложности.