Какие принципы ООП реализованы в Go
Что проверяют
Понимаете ли вы, что Go сознательно отказался от части классического ООП, и можете ли объяснить, чем это заменено.
Как отвечать
Из четырёх принципов в Go есть три, причём в своей форме.
Инкапсуляция есть, но границей выступает пакет, а не тип. Видимость задаёт регистр первой буквы: с заглавной значит экспортируемое, со строчной доступно только внутри пакета. Модификаторов вроде private и protected нет, и метод со строчной буквы видят все типы своего пакета.
Абстракция есть и сделана лучше многих: интерфейс это набор сигнатур, а удовлетворение неявное. Тип не объявляет, что реализует интерфейс, достаточно совпадения методов. Отсюда правило, которое стоит назвать: интерфейс объявляют на стороне потребителя, а не рядом с реализацией.
Полиморфизм есть через интерфейсы: значение интерфейса хранит пару из типа и данных, вызов метода идёт по таблице. Обобщения (с версии 1.18) дают второй вид полиморфизма, параметрический.
Наследования нет вовсе. Вместо него встраивание: безымянное поле структуры продвигает свои методы наружу. Выглядит похоже, но работает иначе, потому что это композиция. Внешний тип не является внутренним, приведения к нему не будет, и виртуальных вызовов из встроенного метода в переопределённый тоже: базовый метод продолжит звать свою версию.
Отдельно про интерфейсы: пустой интерфейс с ненулевым типом внутри не равен nil, и это классическая ловушка при возврате ошибки через конкретный тип указателя.
Где спотыкаются
Называют встраивание наследованием.
Объявляют интерфейс рядом с реализацией и делают его широким.
Пишут type MyStruct struct с геттерами на каждое поле, перенося привычки из Java.
Не могут объяснить, почему интерфейс со значением nil внутри не равен nil.