> Возможно нужно было делать отдельный package реализующий что-то и задействовать его, или договориться о каких-то других интерфейсах внутри или ещё что (варианты бывают очень разные)
>В другом бы языке вы это просто замазали бы наследованием или ещё какой фигнёй, а тут придётся подумать и сделать правильно.Все равно не хватает дженериков и интерфейсы не позволяют делиться реализацией, так что до появления Go 2.0 от копипасты до конца не получится убежать, мне кажется. В Rust, к счастью, тоже нет такой гадости как наследование (в этом и в ряде других вопросов Go и Rust идеологически дружат), но трейты (своего рода интерфейсы, но с куда более широкими возможностями) могут содержать дефолтные имплементации методов, дженерик-имплентации в том числе. Уже это снижает долю копипасты в разы.
> Можно конкретнее (и сравнение с каким-нибудь другим языком)?
Да я на самом деле с теми же C/C+ и Rust сравниваю, которые условно говлря не имеют рантайма вовсе. Так-то у Go он не такой и толстый, но просто при сравнении с Rust, который также позволяет писать безопасный по памяти код, видишь, что можно платить меньше за те же или даже большие гарантии.
> Что это значит? Очень даже конкретная и выразительная система типов. Можно конкретнее?
Недостаток дженериков, вещей вроде трейтов, прозрачных и доступных для пользовательской имплементации итераторов, алгебраических типов и т.д. - все это сильно снижает выразительность языка. В Go, в силу простоты системы типов, значительная часть фундаментальных абстракций реализлвана в виде компилятлрной магии. В Rust огромная часть семантики языка описана кодом в стандартной библиотеке, в том числе итераторы.
> В смысле вы бы предпочли throw-try-catch или к чему это
Конечно нет! Исключения - еще одна гадость, насчет которой Rust и Go дружат во мнении. Я про сочетание оператора ? и выражение match.