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

Курсы

Программирование
Highload Architect Node.js Developer React.js Developer Java Developer. Professional Android Developer. Basic Microservice Architecture HTML/CSS Специализация C++ Developer C++ Developer. Professional Android Developer. Professional PostgreSQL для администраторов баз данных и разработчиков Framework Laravel Алгоритмы и структуры данных Специализация PHP Developer C# Developer. Professional C# Developer. Basic Буткемп Frontend Developer Golang Developer. Professional iOS Developer. Basic Специализация Python Developer Архитектура и шаблоны проектирования MS SQL Server Developer Software Architect Rust Developer Базы данных Разработчик на Spring Framework Vue.js разработчик Разработчик IoT Подготовка к сертификации Oracle Java Programmer (OCAJP) Unity Game Developer. Professional PostgreSQL Cloud Solutions VR/AR - разработчик
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Оператор 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 может показаться странным, однако его преимущество заключается в том, что он не на основе блоков, а на основе функций.

EXTFoC9U4AArZoI_1-1801-5e9055.jpg

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

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

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

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

Автор
0 комментариев
Для комментирования необходимо авторизоваться