© Alan KayЯ изобрел понятие «объектно-ориентированный»,
и могу заявить, что не имел в виду C++.
Let's Go: объектно-ориентированное программирование на Голанге
Gigi Sayfan
Aug 19, 2016 • 6 min read
Объектно-ориентированное программирование в GolangGo - это странная смесь старых и новых идей. У него очень освежающий подход, при котором он не боится отбросить устоявшиеся представления о том, «как делать вещи». Многие люди даже не уверены, является ли Go объектно-ориентированным языком. Позвольте мне сказать это прямо сейчас. Является!
Андрей Шагин
2022
Документация GoLang:Давайте поучимся работать с объектно-ориентированной архитектурой в Golang. Здесь нет классов, зато есть структуры, работа с которыми является единственным способом поддержки объектно-ориентированной модели.
Объектно-ориентированное программирование, по крайней мере в известных языках, включает в себя слишком много разговоров на тему взаимоотношений между типами, взаимоотношений, которые часто могут быть выведены автоматически. Go использует другой подход.
Вместо того, чтобы требовать от программиста объявлять заранее, что два типа связаны, в Go тип автоматически удовлетворяет любому интерфейсу, который специфицирует подмножество его методов. Помимо простого рутинного учёта, такой подход имеет реальные преимущества. Типы могут удовлетворить многим интерфейсам одновременно, без сложностей традиционного множественного наследования. Интерфейсы могут быть очень легковесными — интерфейсом с одним единственным методом, или даже вообще без методов, можно выразить весьма полезные концепции. Интерфейсы могут быть добавлены уже после того, когда новая идея приходит после, или во время тестирования, без существенного изменения оригинальных типов. Потому что нет отчётливой связи между типами и интерфейсами, нет выраженной иерархии типов, которой нужно управлять или которую обсуждать.
Это подобно использованию этих идей для создания чего-то аналогичного типабезопасных UNIX pipes. Например, посмотрите как fmt.Fprintf() позволяет форматировать печать на любой вывод, а не просто в файл, или как пакет bufio может быть полностью отделен от файла в вводе-выводе, или как пакеты обработки изображений позволяют генерировать сжатые файлы изображений. Все эти возможности проистекают из одного интерфейса (io.Writer), представляющего единственный метод (Write()). И это только самые поверхностные примеры. Интерфейсы Go имеют самое глубокое влияние на то, как структурированы программы.
Это требует некоторого привыкания, но этот неявный стиль зависимостей типов является одним из наиболее продуктивных сторон Go.