Замыкание = гибкость
Замыкания в Go используются повсеместно. Они позволяют универсально использовать один и тот же инструмент для работы в разных ситуациях.
Вот, например, карта в пакете sync
— sync.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
.
Полезная штука.
★ Подписывайтесь на новые заметки.