Вот кусочек про ООП для критики.
https://youtu.be/0ReKdcpNyQg?t=22m08sЦитата:
# слайд 19 / 22.08
Все же было ясно, что мы хотели получить некоторую поддержку объектной ориентации. И вдохновение в Go в этом случае пришло из Smalltalk. Всегда хорошо вернуться к создателям чего-то хорошего. Симула [язык программирования] была немного раньше, но имела немного другую природу.
В Smalltalk все является объектами, и я могу отправить сообщение, которое действительно является вызовом метода, для любого объекта. И если объект понимает сообщение, тогда вы знаете, что все в порядке. Если объект не понял сообщение, я получу ошибку. В основном ошибка, которая говорит, что вы знаете, я думаю: «Я не понимаю этого сообщения».
Таким образом, в Go мы хотели иметь такую же мощность, но без возможности получить ошибку во время выполнения о том, что сообщение не понято.
Это означает, что нам нужен способ, которым мы могли бы описать, какие сообщения были поняты объектом. И это привело непосредственно к понятию интерфейсов, поскольку это совершенно очевидно, но в ретроспективе,
Кроме того, для того, чтобы действительно дойти до той же мощности, что и Smalltalk, нам нужно было отправлять сообщения на любой объект. Или в терминологии Go в любой экземпляр любого типа. Как правило, это невозможно в объектно-ориентированном языке. Обычно вы можете отправлять сообщения или фактически вызывать методы в экземплярах классов, потому что в реализации вам нужна дополнительная информация, когда вы делаете виртуальную отправку. Эта дополнительная информация обычно является словом [предупреждением?] или чем-то подобным. И это обычно где-то в структуре данных, которая обычно class или struct в C ++.
Мы поняли, что эта дополнительная информация действительно нужна только при динамической отправке.
Вы можете иметь методы, и у нас они есть в Go без динамической отправки, и они полностью бесплатны. Они по сути являются просто синтаксическим сахаром.
Такая реализация привела к критическому пониманию того, что нам нужна эта информация только в том случае, когда мы хотим сделать динамическую отправку. То есть когда мы вызываем метод через интерфейс.
Прием заключается в том, что мы храним эту информацию в интерфейсе, а не с данными.
С помощью этого механизма стало возможным прикрепить методы к любому типу, не имея экземпляров типа, для хранения дополнительной информации о нем.
Это действительно единственный дополнительный механизм, который был необходим, чтобы сделать объектную ориентацию возможной в Go.