Замыкания = универсальность



В языке Go замыкания используются повсеместно, давая возможность гибко решать разные задачи, используя один и тот же механизм.



Например, рассмотрим работу с картой в пакете sync — sync.Map:



var m sync.Map

m.Store("john", 21)

m.Store("maria", 25)

m.Store("steve", 29)




Для итерации по карте есть метод Range с сигнатурой:



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




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



sum := 0

m.Range(func(key, value any) bool {

sum += value.(int)

return true

})




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



Замыкания дают мощный инструмент для гибкости в коде.



👉 @juniorGolang