структуры, интерфейсы, композиция вместо классовstructs, interfaces, composition instead of classes

ООП в Goin Go

В Go осознанно нет классов, наследования и конструкторов как отдельного синтаксиса. Этот раздел раскладывает 14 базовых концепций ООП плюс полиморфизм (только через интерфейсы) на то, что Go реально предлагает (структуры, интерфейсы, embedding) — 5 базовых концепций (деструкторы, свойства, индексаторы, наследование, события) в список не попали, потому что у Go для них нет даже идиоматичной замены на уровне языка. Каркас: 14 карточек, страницы ещё не написаны.Go deliberately has no classes, no inheritance, and no constructors as dedicated syntax. This section maps the 14 baseline OOP concepts plus polymorphism (interfaces only) onto what Go actually offers (structs, interfaces, embedding) — 5 baseline concepts (destructors, properties, indexers, inheritance, events) are missing from the list because Go has no idiomatic substitute at the language level for any of them. Skeleton: 14 cards, pages not yet written.

Базовые концепции ООПBaseline OOP concepts

Определение классов, инициализацияClass definition & initializationtype Foo struct{...} и литералы структур and struct literals Foo{Field: value} — нет ни class, ни отдельного синтаксиса инициализации. — no class keyword, no dedicated init syntax.interview КонструкторыConstructorsнет конструкторов как языковой конструкции — только соглашение no constructors as a language construct — only the convention func NewFoo(...) *Foo, компилятором никак не навязывается., not enforced by the compiler in any way.interview ПоляFieldsэкспортируемые exported Capitalized vs неэкспортируемые vs unexported lowercase — видимость на уровне пакета, а не public/private/protected для каждого типа. — package-level visibility, not per-type public/private/protected. МетодыMethodsфункция с ресивером: a function with a receiver: func (f Foo) M() (по значению) против (value receiver) vs func (f *Foo) M() (по указателю) — классическая тема на собеседованиях. (pointer receiver) — a classic interview topic.interview Сигнатуры и перегрузкаSignatures & overloadingперегрузки нет вообще — одно имя, одна сигнатура; вариативные аргументы или no overloading at all — one name, one signature, ever; variadic args or interface{}/any вместо неё. substitute for it.interview ПолиморфизмPolymorphismтолько через интерфейсы — неявная реализация вместо наследования, диспетчеризация во время выполнения через таблицу методов интерфейса.interfaces only — implicit satisfaction instead of inheritance, runtime dispatch via the interface's method table.interview Вложенные классыNested classesтипы структур можно объявлять внутри функции (локальные типы) или как именованные поля, но настоящего «вложенного класса» с особым доступом к внешнему типу нет.struct types can be declared inside a function (local types) or as named fields, but there's no true "nested class" with special access to the outer type. КонстантыConstantsconst блоки и blocks and iota для enum-подобных последовательностей — реальный и идиоматичный механизм, частый вопрос на собеседованиях. for enum-like sequences — a real and idiomatic mechanism, a common interview question.interview Копирование объектовCopying objectsструктуры Go — value-типы по умолчанию, присваивание копирует; встраивание Go structs are value types by default, assignment copies; embedding a sync.Mutex молча ломает «безопасность копирования» — классическая ловушка silently breaks the "safe to copy" default — the classic go vet предупреждения. trap.interview Члены типаType membersметоды можно объявлять на любом именованном типе, не только на структурах — например methods can be declared on any named type, not just structs — e.g. type Celsius float64; func (c Celsius) ToFahrenheit() — характерно именно для Go. — distinctly Go.interview

Специфика GoGo-specific

то, чем Go заменяет классическое ООПwhat Go substitutes for classical OOP
Интерфейсы и структурная типизацияInterfaces & structural typingнеявное удовлетворение — нет ключевого слова implicit satisfaction — no implements: если у типа есть нужные методы, он автоматически подходит под интерфейс. keyword: if a type has the methods, it satisfies the interface automatically.interview Встраивание структурStruct embeddingкомпозиция с продвижением методов/полей — синтаксически похоже на наследование, но это НЕ полиморфизм: нет динамической диспетчеризации через встроенный тип.composition with method/field promotion — syntactically looks like inheritance, but it is NOT polymorphism: no dynamic dispatch through the embedded type.interview Пустой интерфейс / anyThe empty interface / anyinterface{} (алиас (aliased as any с Go 1.18) — способ хранить значение любого типа, лазейка до появления generics. since Go 1.18) — a way to hold a value of any type, Go's pre-generics escape hatch. Методы на именованных не-структурных типахMethods on non-struct named typestype Celsius float64 с методами поверх — типобезопасность и поведение без единой структуры или класса-обёртки. with methods on top — type safety and behavior with no struct or wrapper class involved.

статусstatus

Это каркас: 2 подраздела и 14 карточек зафиксированы, страницы ещё не написаны. Из 5 языков этой сравнительной серии у Go меньше всего карточек — 5 базовых концепций (деструкторы, свойства, индексаторы, наследование, события) в список не попали: философия языка сознательно отвергает классическое ООП-наследование в пользу композиции через embedding и структурной типизации через интерфейсы. Полиморфизм в Go есть, но только через интерфейсы, без наследования. Метка interview отмечает самые частые вопросы на собеседованиях: value vs pointer receivers, отсутствие перегрузки, embedding вместо наследования, полиморфизм через интерфейсы, ловушка с копированием sync.Mutex, методы на именованных типах.This is a skeleton: 2 subsections and 14 cards are locked in, pages not yet written. Of the 5 languages in this comparison series, Go has the fewest cards — 5 baseline concepts (destructors, properties, indexers, inheritance, events) are missing from the list: the language's design philosophy deliberately rejects classical OOP inheritance in favor of composition via embedding and structural typing via interfaces. Go does have polymorphism, but only via interfaces, with no inheritance involved. The interview tag marks the most common interview questions: value vs pointer receivers, the lack of overloading, embedding vs inheritance, interface-based polymorphism, the sync.Mutex copy trap, methods on named types.