Оператор defer в языке Go | OTUS
Скидка до 15% на курсы ноября, декабря и января
❄️ До 25.12 Забрать скидку! →
Выбрать курс

Оператор defer в языке Go

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

13319422_1615028164_1-1801-ec7db9.jpg

Давайте посмотрим, как это работает:

1-1801-f5e0a8.png

Отсрочка вызова функции, той же Close, имеет следующие плюсы:

  1. Гарантируется, что вы не забудете закрыть файл (такую ошибку легко допустить, если вы позже выполните редактирование функции для добавления нового пути возврата).
  2. Отсрочка вызова означает, что закрытие будет находиться рядом с открытием, а это гораздо понятнее, чем помещение в конец функции.

Аргументы для отложенной функции (включают получателя, когда функция является методом) оцениваются, если выполняется defer, а не в том случае, когда выполняется вызов (call). Такое положение вещей поможет избежать лишних забот о переменных, которые меняют значения в случае выполнения функции, что тоже значит, что отложить исполнение нескольких функций может лишь одно место отложенного вызова. Рассмотрим простой пример:

2-1801-265f8e.png

Важно отметить, что отложенные функции выполняются в соответствии с LIFO (last-in-first-out), следовательно, данный код вызовет "4 3 2 1 0" для печати после возврата из функции. Также можно написать пару простых трассировок:

3-1801-a31e22.png

Еще момент: аргументы отложенных функций оцениваются во время выполнения defer. Например, процедура трассировки способна установить аргумент для процедуры отслеживания. Смотрим пример ниже:

4-1801-6be47f.png

Будет напечатано следующее:

5-1801-de6ac7.png

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

По материалам https://golang-blog.blogspot.com/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто
Новогодние скидки в Otus!-15% ❄️
Успейте забрать свою скидку до 25.12 →