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)
}
песочница
То есть это такой синтаксический сахарок.
Стоило ли оно того? Об этом следующая заметка.
Если вы ничего не поняли из предыдущей заметки — ничего страшного. Давайте обсудим суть новой фичи, не погружаясь в детали реализации.
Предположим, вы написали собственный тип 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)
}
песочница
То есть это такой синтаксический сахарок.
Стоило ли оно того? Об этом следующая заметка.