Ответ 1
panic/recover - это моральный эквивалент исключений try/catch. Существует поверхностная разница (синтаксис) и тонкая, но важная разница в предполагаемом использовании.
Лучшими объяснениями проблем с исключениями в целом являются "Чистое, более элегантное, неправильное" и что хороший обзор плюсов и минусов исключения по сравнению с кодами ошибок возврата.
ДизайнерыGo решили, что обработка ошибок путем возврата кодов ошибок из функций - это идиоматический способ Go, и язык поддерживает несколько возвращаемых значений, чтобы сделать его синтаксически простым. В то время как panic/recover предоставляется, разница не в функциональности, а в намеренном использовании.
Другие языки, раскрывающие исключения, способствуют их использованию, и на практике они часто используются (иногда даже неправильно используются).
Go препятствует использованию паники/восстановления. Вы можете это сделать, но вы должны делать это только в очень ограниченных сценариях.
Если вы посмотрите на стандартную библиотеку Go, большинство использования паники предназначены для сигнализации фатальных ошибок, указывающих либо внутреннюю ошибку (т.е. ошибку) в библиотечном коде или вызове библиотеки с неправильными данными (например, передача не-json-данных в функции json-декодирования).
Но в статье, на которую вы ссылаетесь, указывается: "Соглашение в библиотеках Go заключается в том, что даже если пакет использует панику внутри, его внешний API по-прежнему представляет явные значения возвратов ошибок".
Это отличается от таких языков, как С#, Java, Python или С++, где много стандартного кода библиотеки может генерировать исключения для ошибок сигнала. Эти языки хотят, чтобы вы использовали исключения. Go препятствует использованию паники/восстановления.
Подводя итог:
- idiomatic Go style - использовать коды ошибок, чтобы сообщить вызывающему об ошибках
- используйте panic/recover только в редких случаях:
- для "краха" вашей программы, когда вы сталкиваетесь с внутренней несогласованностью, указывающей на ошибки в вашем коде. Это в основном отладочная помощь.
- если он значительно упрощает обработку ошибок в вашем коде (но если код должен использоваться другими, никогда не выставляйте такие паники вызывающим абонентам)
На практике важно использовать языковой идиоматический стиль. В Go, который возвращает коды ошибок и избегает паники/восстановления. В С#, который использует исключения для сигнализации некоторых ошибок.