Я продолжаю смотреть на этот вопрос, пытаясь придумать, как лучше на него ответить. Проще всего указать на идиоматическое использование паника / восстановление , а не try / catch & | исключения в других языках, или понятия, лежащие в основе этих идиом (которые можно в основном обобщить как «исключения должны возникать только в действительно исключительных обстоятельствах»)
Но что же такое фактическая разница между ними? Я постараюсь обобщить как можно лучше.
Одним из основных отличий по сравнению с блоками try / catch является способ управления потоками. В типичном сценарии try / catch код после блока catch будет выполняться, если только он не распространит ошибку. Это не так с паника / восстановление . Паника прерывает текущую функцию и начинает разматывать стек, запуская отложенные функции (единственное место, где восстанавливается что-либо), когда встречается с ними.
На самом деле, я бы пошел еще дальше: паника / восстановление почти не похоже на try / catch в том смысле, что try и catch являются (или, по крайней мере, действуют как) контролем структуры, и паники / восстановления не являются.
Это действительно вытекает из того факта, что восстановление построено вокруг механизма отсрочки, который (насколько я могу судить) является довольно уникальной концепцией в Go.
Конечно, есть еще кое-что, что я добавлю, если смогу немного активизировать свои мысли.