> интерфейсы не позволяют делиться реализациейЭто нужно реально редко. Например, часто бывает достаточно просто продумать другие интерфейсы, чтобы дублируемая реализация тупо была отдельным package-ем (который можно будет цеплять и вообще в других пакетах потом), вместо попытки её дублировать в реализации каких-то других интерфейсов.
Есть проблема с generic-ами, когда, например, пытаешься без reflect-а (ибо он медленный) сделать какую-нибудь сериализацию/десериализацию. Там ты как не дизайн и не перепродумывай интерфейсы, всё равно куча одинакового кода. Сейчас в Go обходятся кодогенерацией (что по сути даёт временный вариант generic-ов).
> трейты (своего рода интерфейсы, но с куда более широкими возможностями) могут содержать дефолтные имплементации методов,
Да, слышал хвальбы трейтов от весьма грамотных людей. Но сам использовал Rust мало, и пока не прочувствовал.
> Так-то у Go он не такой и толстый, но просто при сравнении с Rust, который также позволяет писать безопасный по памяти код, видишь, что можно платить меньше за те же или даже большие гарантии.
Говоря "толстый", что имеется в виду? Что бинарий много весит? Если да, то тут буквально недавно экспериментировал с rust и go на примере hello world, и как-то разницы не почувствовал.
По поводу "платить меньше". К сожалению, Rust отнимает больше времени программиста. И это по множеству причин:
* Сырой и нестабильный. Зачастую инструкцию по установке какого-то rust-приложения начинается с "установите unstable такой-то версии". Какие-то пакеты хотят одну версию, какие-то другую. Вроде бы хочешь сделать какую-нибудь тривиальную вещь, а тратишь весь день.
* Rust просто требует больше мозговых ресурсов (требует более сложные и глубокие мысли). В Go же мысль больше фокусируется на том, что ты хочешь сделать, а не на том, как это сделать.
* Под Rust меньше всего уже написано, чем под Go. Просто популярность у Rust ниже.
* Субъективно (лично для меня:), Go очень открытый, прозрачный и понятный. Там очень легко разобраться в любой детале (даже если она совсем internals).
Я бы сам использовал Rust в качестве основого языка, если бы не ощутил насколько больше времени сжирает (в сравнении с Go) сделать одно и то же.
> Недостаток дженериков, вещей вроде трейтов, прозрачных и доступных для пользовательской имплементации итераторов, алгебраических типов и т.д. - все это сильно снижает выразительность языка.
По поводу итераторов немного не понял, чего вы хотите. По остальному согласен. Но это мелочные проблемы (и которые, вроде как, обещаются быть исправленными в будущем).
> значительная часть фундаментальных абстракций реализлвана в виде компилятлрной магии
А можно пример? Я просто тупой, и не понял :)
> Я про сочетание оператора ? и выражение match.
Это ж просто синтаксический сахар, если я не ошибаюсь. То есть это не делает программу другой, а лишь сокращает количество строк (свёртывает код в более компактную форму). Если, например, вы работаете в GoLand, то какой-нибудь трёстрочник из "if err != nil { return fmt.Errorf("sdfsdf: %w", err) }" тоже свернётся в серенький неприметненький однострочник.