Skip to content

Замыкания (Closures) и анонимные функции в Go

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

Ты можешь присвоить анонимную функцию переменной, и затем использовать эту переменную как любую другую функцию, как показано в примере ниже.

Самое время протестировать код!

Объявленная переменная может быть в области видимости пакета или внутри функции, как показано в листинге ниже.

Самое время протестировать код!

Можно объявить и задействовать анонимную функцию, как показано ниже.

Самое время протестировать код!

Анонимные функции могут пригодиться, если нужно быстро написать функцию на ходу. Это может быть возвращение одной функции от другой функции. Хотя функция может возвращать существующую именованную функцию, объявлять и возвращать новую анонимную функцию может быть гораздо полезнее.

В Листинге 6 функция calibrate настраивается на ошибки в показаниях температуры воздуха. С помощью функции первого класса calibrate принимает фейковый или реальный сенсор в качестве параметра и возвращает функцию замены. Всякий раз, когда вызывается новая функция sensor, вызывается исходная функция, а чтение корректируется смещением.

Самое время протестировать код!

Анонимная функция в предыдущем листинге использует замыкания. Это отсылка к переменным s и offset, что функция calibrate принимает в качестве параметров. Даже после возвращения функции calibrate, переменные, зафиксированные замыканием, остаются. Таким образом, у sensor все еще есть доступ к данным переменным. Анонимная функция нужна для размыкания переменных в области видимости, что объясняет термин замыкание.

Из-за того, что замыкание сохраняет ссылку на ближайшие переменные, а не копирует их значения, изменения с этими переменными отражаются в вызовах к анонимной функции.

Имей это в виду, особенно при использовании замыкания внутри циклов for!

Полную версию статьи ты можешь найти на сайте golangify.

Подробнее изучить эту тему ты можешь в следующих материалах: