Вы когда-нибудь задумывались, почему можно писать вот такой код:
type T struct{ V int }
a := []*T{{0}, {1}, {2}}
b := map[string]*T{"a": {0}, "b": {1}, "c": {2}}
c := [3]T{{0}, {1}, {2}}
Но нельзя вот такой:
var x []string = {"a", "b", "c"}
var y []*T = {{0}, {1}, {2}}
var z T = {0}
Всё дело в довольно сложных правилах вывода типов для сложных типов. Ещё в первых версиях создатели языка резонно решили, что одного объявления при инициализации достаточно и нет смысла дублировать идентификатор типа для каждого элемента отдельно. Что, в свою очередь, очень помогло в табличных тестах. Но вот сделать ещё один шаг им не хватило
Однако всё течёт, всё меняется, и запрос на tuples (кортежи) или их аналог регулярно всплывал в issue-трекере языка. Причину для этого запроса лучше всего описать следующим кодом:
ch := make(chan struct {
value string
err error
})
//...
ch <- struct {
value string
err error
}{value: "result"}
Расписывать описание анонимной структуры и в момент декларации, и в момент использования очень неудобно, что нередко приводило к ситуациям, когда люди создавали локальный тип (или использовали алиас), чтобы не писать описание повторно.
И вот теперь, наконец
ch <- {value: "result"}
fnT({0})
var s []*T = {{0}, {1}, {2}}
return {}, err
Последнее меня особенно радует, так как во многих кодобазах люди специально использовали возврат указателей из функции, так как не хотели писать длинное имя типа с пакетом.
А из дополнительных плюсов, данное изменение приведёт к упрощению (!!!) спеки языка, а значит разработчикам компиляторов Go станет чуть легче жить.
Текущий статус: