«Завтра никогда не наступит» - это то, что мы говорим ленивым душам, которые любят откладывать самые важные дела в жизни вместо того, чтобы на самом деле их делать. Разрешите мне перечислить некоторые популярные мнения о переносе работы на завтра:

  • Никогда не откладывайте на завтра то, что можно сделать сегодня
  • Чем ленивее мужчина, тем больше он планирует делать завтра
  • Никто не слишком молод, чтобы умереть завтра
  • Завтра день, когда бездельники будут заняты

Это прекрасные самородки мудрости, правда? Что ж, никогда их не забывай.

Вопреки этой мудрости в реальной жизни Golang дает вам инструменты для откладывания действий, и, как бы нелогично это ни звучало, на самом деле это хорошая вещь, которой так жаждут программисты, использующие другие языки. Я просто представил противоположные мысли? Нет!

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

Кроме того, если вам нравятся мои сообщения на Golang, то сделайте хорошо, если подпишитесь на мой Курс быстрого перехода на Youtube, чтобы получать уведомления о последних видео, которые я публикую через день.

Что такое отсрочка?

Что ж, defer, как следует из названия, позволяет отложить. Я рекурсивен? Может быть нет.

В go ключевое слово defer используется для отсрочки выполнения оператора до конца функции, окружающей этот оператор. Прежде чем я покажу вам демо, я призываю вас всегда помнить следующее:

  • Несколько операторов defer выполняются в обратном порядке; последний пришел - первый ушел или LIFO.
  • Параметры отложенных функций разрешаются немедленно. Да, запомните это, чтобы избавиться от головной боли.

Покажи мне дем-коды

Следующий пример кода намеренно сделан очень простым, поскольку конечная цель этого поста - помочь вам понять работу «defer» в go. И не нужна мудрость царя Соломона, чтобы понять, что он делает, не так ли? Синтаксис Go настолько хорош, что его могли понять даже доадамические существа. Ржу не могу!

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

Вы можете заметить разницу? Я добавил defer в начале строки 9, и внезапно наша программа стала достойной того, чтобы ее вывод был показан в этом посте. Другими словами, он внезапно стал достойным поста (смеется). Теперь посмотрим на результат.

Suuuuurpriiiise !!! А, разве мы не должны видеть надпись «Завершение основной функции» в конце программы? Нет, потому что мы использовали defer в строке 9, которая предшествует строке 10. Эффект defer для нашей программы заключается в том, что, как следует из названия, он откладывает выполнение строки 9 до тех пор, пока основная функция (включающая функция) не завершит выполнение этой почему результат кажется удивительным.

Отложим еще несколько заявлений. В конце концов, завтра будет самый загруженный день для всех ленивых, не так ли?

Можете ли вы предсказать, какой будет результат? Я обещаю вам львиное яйцо, если вы все правильно поняли. Подсказка: вы помните, как я сказал, что несколько операторов defer выполняются в порядке «последним пришел - первым ушел» (LIFO)? Что ж, теперь посмотрим на результат.

Приходите за львиной яйцом, если ваша догадка верна. Uno, поскольку несколько операторов defer выполняются в порядке LIFO, строка 9 выполняется перед строкой 8, а строка 10 фактически выполняется первой, потому что все, что было до этого, было отложено до того момента, как непосредственно перед завершением окружающей функции.

Я могу отложить сейчас, в чем смысл?

Вы потратили часы на отладку кода из-за того, что забыли закрыть файл после чтения или записи в него? Вы забыли закрыть соединение сокета раньше? Если вас когда-либо постигла подобная участь, то ключевое слово defer - ваше обезболивающее. Чем дальше оператор, необходимый для закрытия ресурса, от предыдущих операторов, используемых для его обработки, тем более вероятно, что вы забудете закрыть этот ресурс. Причем, в зависимости от вашей ОС, это действие может караться расстрелом.

Не обращайте внимания на строку чтения под строкой 8, это просто глупо из-за того, что я не использую файл переменных и ошибаюсь. (Выполнение этого в реальной жизни позволит вашему коду не компилироваться)

И последнее, что вам нужно знать

Вы помните, я сказал, что аргументы, передаваемые отложенным функциям, оцениваются немедленно? Что ж, давайте посмотрим на пример.

Неудивительно, что приведенная выше программа напечатает 0 вместо суммы чисел от 0 до 9, как мы ожидали от цикла for между строками 11 и 14. Причина в том, что в строке 8, когда мы использовали ключевое слово defer, значение of sum было 0, поскольку это значение по умолчанию для целых чисел.

Наконец, если вам нравятся мои сообщения на Golang, то сделайте хорошо, если подпишитесь на мой Курс быстрого перехода на Youtube, чтобы получать уведомления о последних видео, которые я публикую через день.

И это конец. Спасибо!!!