Дженерики на методах
Раньше методы могли использовать параметры типов своего receiver’а, но не могли объявлять дополнительные. Теперь могут.
type Box[T any] struct {
Value T
}
func (b Box[T]) Map[U any](fn func(T) U) Box[U] {
return Box[U]{Value: fn(b.Value)}
}
Чувствую, теперь будут повсеместно фигачить магические цепочки типа таких:
result := Box[int]{Value: 42}.
Map(strconv.Itoa).
Map(func(s string) int {
return len(s)
})
fmt.Println(result.Value) // 2
С одной стороны, это хорошо для стандартной библиотеки: её API можно будет делать более гибкими. С другой стороны, чем больше обобщённых языковых конструкций, тем больше контекста может понадобиться LLM, чтобы понять, что скрывается за таким выражением.
Кстати, у Google недавно была статья, в которой они утверждали, что Go — чуть ли не лучший язык для LLM.
Интерфейсные методы по-прежнему не могут иметь собственные параметры типов, а generic-метод не может реализовать обычный метод интерфейса
Далее, поля embedded структур теперь инициализируются проще.
type Contact struct {
Email string
Phone string
}
type User struct {
Name string
Contact
}
Раньше приходилось писать так:
user := User{
Name: "Анна",
Contact: Contact{
Email: "anna@example.com",
Phone: "+7 999 000-00-00",
},
}
Теперь можно делать так:
user := User{
Name: "Анна",
Email: "anna@example.com",
Phone: "+7 999 000-00-00",
}
Опять же, меньше писанины, больше магии.
Улучшился вывод типов generic-функций
Например, есть функция, которая превращает значение в строку:
func FormatValue[T any](value T) string {
return fmt.Sprint(value)
}
И мы хотим добавить её в список форматтеров.
Раньше тип приходилось указывать явно:
formatters := map[string]func(int) string{
"default": FormatValue[int],
"hex": func(value int) string {
return fmt.Sprintf("0x%x", value)
},
}
В Go 1.27 можно не писать
[int]
formatters := map[string]func(int) string{
"default": FormatValue,
"hex": func(value int) string {
return fmt.Sprintf("0x%x", value)
},
}
Компилятор видит, что значения map должны иметь тип
func(int) string, и сам выводит для FormatValue параметр T = int.Не знаю, честно говоря, насколько это всё важно, потому что код пишет теперь LLM, а ему и так было норм 🙂
Интереснее то, что наконец-то затащили json/v2, который тупо в разы быстрее при анмаршаллинге.