Замыкание = гибкость

Замыкания в Go используются повсеместно. Они позволяют универсально использовать один и тот же инструмент для работы в разных ситуациях.

Вот, например, карта в пакете syncsync.Map:

var m sync.Map
m.Store("alice", 11)
m.Store("bob", 12)
m.Store("cindy", 13)

Чтобы проитерироваться по карте, предусмотрен метод Range с такой сигнарутой:

Range(f func(key, value any) bool)

Но что делать, если мы хотим просуммировать все значения карты? Кажется, Range не дает такой возможности. Придется переписать все на питон.

Ну или использовать замыкание:

total := 0
m.Range(func(key, value any) bool {
    total += value.(int)
    return true
})

Анонимная функция, переданная в Range, использует внешнюю переменную total как накопитель. Таким образом можно реализовать вообще любое поведение, не трогая сигнатуру Range.

Полезная штука.

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