range по функциям в Go

В Go 1.23 (август 2024) появится цикл range по функциям. Проще всего показать на примере.

Предположим, вы написали собственный тип OrderedMap, который (в отличие от обычной карты) сохраняет порядок элементов.

Сделали ему конструктор и метод Set:

m := NewOrderedMap[string, int]()
m.Set("one", 1)
m.Set("two", 2)
m.Set("thr", 3)

Хорошо, а как теперь итерироваться по карте? Традиционно это делали примерно так:

m.Range(func(k string, v int) {
  fmt.Println(k, v)
})
// one 1
// two 2
// thr 3

песочница

А с новой фичей range-over-func можно сделать так:

for k, v := range m.Range {
  fmt.Println(k, v)
}

песочница

То есть это такой синтаксический сахарок.

Стоило ли оно того

Стоило ли добавлять в язык range-over-func? На мой взгляд — нет.

Сила Go — в дубовости. У нас уже есть много фичастых языков с большой внутренней сложностью (Java, C#, C++), и Go был единственной простой мейнстрим-альтернативой для них.

Да, Go не модный, и код на нем простынявый. Но он простой до примитивности, и это хорошо.

С появлением дженериков в 1.18 по простоте языка был нанесен серьезный удар (вероятно, оправданный). Теперь же авторы продолжают усложнять язык без веских на то причин, просто чтобы было красивенько.

Почему так происходит?

Есть подозрение, что в команде разработки Go заработал стандартный для гугла процесс — promotion-driven development. Развитием языка управляют люди, которым надо демонстрировать выполнение KPI — а значит, будут поливать Go фичами из шланга, превращая в еще одну джаву.

Ждут нас и корутины, и стримы, и паттерн-матчинг.

Штош.

★ Подписывайтесь на новые заметки.