Как сообщает телеграм-канал Cross Join, предложение по добавлению дженериков в Go наконец-то приняли.
Ссылка на сам документ здесь: type parameters.
type Stringer interface {
String() string
}
type Plusser interface {
Plus(string) string
}
func ConcatTo[S Stringer, P Plusser](s []S, p []P) []string {
r := make([]string, len(s))
for i, v := range s {
r[i] = p[i].Plus(v.String())
}
return r
}
Принятие proposal означает, что скорее всего в 1.18beta можно будет эту функциональность уже попробовать.
Цитата из официального блога:
If the proposal is accepted, our goal will be to have a complete, though perhaps not fully optimized, implementation for people to try by the end of the year, perhaps as part of the Go 1.18 betas.
Т.е. разработчики языка постараются сделать какой-то рабочий вариант до конца года. Он возможно, будет не слишком оптимизированный, но можно будет уже поиграться.
Поздравляем всех гоферов с этой отличной новостью!
blind_oracle
То есть даже Go 2.0 ждать не придётся? Чудеса...
gudvinr
Разработчики никогда не позиционировали "Go 2.0" как мажорный релиз, в котором всё сломают и перепишут. По крайней мере, в блогах они пишут, что не стоит на это расчитывать в ближайшем будущем.
Это скорее дополнение к стандартному proposal evaluation process (который не позволяет вносить изменения, значительно меняющие язык), позволяющее, собственно, предлагать изменения вроде дженериков, которые будут значительно менять язык
blind_oracle
Само собой.
Но, как я всегда считал, Go 2.0 может сломать Go 1.x Compatibility Promise (который, конечно, всё равно нарушают в некоторой степени)
Добавление дженериков, конечно, этого не должно сделать — это расширение языка, обратную совместимость не должно сломать.
eyudkin
После введения дженериков ряд стандартных пакетов (из очевидного — container) хотелось бы видеть переделанными с пустых интерфейсов на дженерики, что, конечно, сломает обратную совместимость.
Самое то для go2 :)