Ответ
В Go отсутствует классическое ООП с классами, наследованием и иерархией типов. Вместо этого язык предлагает прагматичный и гибкий подход, основанный на композиции и интерфейсах.
Ключевые концепции:
-
Структуры (structs) вместо классов. Структуры используются для группировки данных. Они являются аналогом полей класса.
type User struct { ID int Name string } -
Методы для любых типов. В Go методы можно определять для любого именованного типа, а не только для структур. Это позволяет добавлять поведение к простым типам.
func (u User) Greet() string { return "Hello, my name is " + u.Name } -
Композиция вместо наследования. Go поощряет использование композиции через встраивание (embedding). Встроенная структура делегирует свои поля и методы родительской структуре, что позволяет достичь повторного использования кода.
type Admin struct { User // Встроенный тип User AccessLevel string } // admin := Admin{} // admin.Name = "John Doe" // Доступ к полю встроенной структуры // admin.Greet() // Доступ к методу встроенной структуры -
Интерфейсы для полиморфизма. Интерфейсы в Go определяют поведение (набор методов). Тип удовлетворяет интерфейсу неявно, если он реализует все его методы. Это обеспечивает гибкость и слабую связность компонентов.
type Greeter interface { Greet() string } // Тип User неявно реализует интерфейс Greeter
Итог: Go придерживается принципа "композиция вместо наследования", предлагая более простую и гибкую модель. Отсутствуют конструкторы, деструкторы, перегрузка методов и операторов, что делает код более предсказуемым и легким для чтения.
Ответ 18+ 🔞
А, ну вот, опять про ООП заговорили! Давайте разберемся, что в Го творится, а то народ с джавы и шарпа приходит и глаза по пять копеек — где, мол, классы, где наследование, где мой любимый super()? А нихуя такого нету!
Вот представьте: вы пришли в магазин за классическим тортом «Наполеон», а вам говорят — «у нас только чизкейк, но он, блядь, настолько офигенный, что вы забудете про все эти слоёные коржи». Вот так и Го.
Ключевые пиздели:
-
Структуры (structs) — это ваши новые поля. Не классы, нет. Просто коробочка для данных. Храните там что хотите.
type User struct { ID int Name string } -
Методы можно прилепить на что угодно. Серьёзно, на любой ваш тип. Хотите, чтобы ваша хуйня
type MySuperInt intумела говорить? Пожалуйста, навешивайте метод!func (u User) Greet() string { return "Hello, my name is " + u.Name } -
Наследования нет. Вообще. Забудьте. Вместо него — композиция, или, как это у них называется, встраивание (embedding). Это как взять одну коробку с данными и сунуть её внутрь другой. И всё, что было в первой, автоматом становится доступно во второй. Магия, ёпта!
type Admin struct { User // Встроили User. Всё, теперь у Admin есть все поля и методы User. AccessLevel string } // admin := Admin{} // admin.Name = "John Doe" // Опа, поле Name от встроенного User! // admin.Greet() // И метод Greet() тоже работает! -
Полиморфизм через интерфейсы — и это гениально. Интерфейс — это просто список методов. «Умеешь делать вот это и вот это? Молодец, ты реализуешь интерфейс». Никаких слов
implementsписать не надо. Тип сам решает, подходит он или нет. Это, блядь, как придти на работу и начать делать задачи — если делаешь, значит ты программист, даже если в трудовой книжке написано «клоун».type Greeter interface { Greet() string } // User автоматически реализует Greeter, потому что у него есть метод Greet(). // Никаких явных указаний. Тишина, покой, ни хуя себе.
Итог, сука: Го выкинул всю эту ооп-пургу с конструкторами, деструкторами, абстрактными фабриками фабрик и прочим наследием единорогов. Всё строится на композиции и «утиной типизации» (если ходит как утка и крякает как утка — значит, нахуй, это утка и есть). Код становится проще, прямолинейнее, и мозг не вытекает из ушей, когда пытаешься понять десятиуровневую иерархию классов. Простота, блядь, рулит.