Мне нравится.
Язык, который вы используете, влияет на ваши шаблоны мышления. (Просто попросите программиста C реализовать «подсчет слов». Возможно, они будут использовать связанный список, а затем переключатся на двоичное дерево для повышения производительности. Но каждый программист на Java / Ruby / Python будет использовать Dictionary / Hash. Язык повлиял на их мозги так много, что они не могут думать об использовании какой-либо другой структуры данных.)
С наследованием вы должны строить вниз - начните с абстрактной вещи, затем подклассифицируйте ее к специфике. Ваш действительно полезный код будет погружен в класс N уровней. Это затрудняет использование «части» объекта, потому что вы не можете повторно использовать код без перетаскивания в родительские классы.
В Go вы можете «моделировать» свои классы таким образом (с помощью интерфейсов). Но вы не можете (не можете) кодировать таким образом.
Вместо этого вы можете использовать встраивание. Ваш код может быть разбит на маленькие, изолированные модули, каждый со своими данными. Это делает повторное использование тривиальным. Эта модульность имеет мало общего с вашими "большими" объектами. (т. е. в Go вы можете написать метод quack (), который даже не знает о вашем классе Duck. Но на типичном языке ООП вы не можете объявить «моя реализация Duck.quack () не имеет зависимостей от любые другие методы утки. ")
В Go это постоянно заставляет программиста задумываться о модульности. Это приводит к программам, которые имеют низкую связь. Низкое сцепление значительно облегчает техническое обслуживание. («О, смотри, Duck.quack () действительно длинный и сложный, но, по крайней мере, я знаю, что это не зависит от остальной части Duck.»)