Перейти к содержимому
9 / 15

defer, panic и recover: что это и когда уместно

defer откладывает вызов до выхода из функции — не из блока, а именно из функции. Отложенные вызовы складываются в стек и выполняются в обратном порядке, причём выполняются всегда: и при обычном возврате, и при панике. Это делает defer штатным способом освобождать ресурсы рядом с местом их захвата. Важнейшая тонкость: аргументы вычисляются в момент объявления, а не в момент выполнения, поэтому defer fmt.Println(i) напечатает значение на момент строки с defer. Обойти это можно замыканием. panic — не аналог исключения: она предназначена для программных ошибок и невосстановимых ситуаций, а ожидаемые проблемы возвращают через error. recover работает только внутри отложенной функции и перехватывает панику текущей горутины; паника в другой горутине уронит весь процесс, сколько бы recover ни стояло снаружи. Именованный результат позволяет recover подменить возвращаемое значение.

defer, panic и recover: что это и когда уместно | JScriptiser