TGViewer
Cross Join - канал о разработке Cross Join - канал о разработке @crossjoin · 3.82K subscribers
Post #668 1.67K
В Go 1.27, который вышел 19 августа, есть несколько любопытных изменений в самом языке.

Дженерики на методах

Раньше методы могли использовать параметры типов своего 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, который тупо в разы быстрее при анмаршаллинге.
  • 👍 13
  • 🥴 2
  • 😁 1
More from @crossjoin
  1. Sep 28, 2026Слышал недавно в каком-то подкасте мысль, что Haskell плохо подходит для вайбкодинга прост…
  2. Sep 26, 2026Антон Жиянов написал мини-книгу по Go-concurrency. Это что-то вроде плотного конспекта с и…
  3. Sep 22, 2026photo post
  4. Sep 14, 2026Поможем Руслану собрать фидбек. Проект некоммерческий 👆
  5. Sep 14, 2026AGBX (Agent Box) — небольшой open-source CLI для запуска Claude Code и Codex в изолированн…
  6. Sep 5, 2026Обалдеть, что творится. На Рейтерс вышла статья, в которой утверждается, что, помимо сканд…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →