Я согласен с ответом jnml, что они оба являются идиоматическим кодом, и добавлю следующее:
Ваш первый пример:
if err != nil {
//handle err
}
более идиоматичен при работе с более чем одним возвращаемым значением. например:
val, err := someFunc()
if err != nil {
//handle err
}
//do stuff with val
Ваш второй пример - хорошее сокращение, когда вы имеете дело только со err
значением. Это применимо, если функция возвращает только error
, или если вы намеренно игнорируете возвращаемые значения, кроме error
. В качестве примера, это иногда используется с Reader
и Writer
функциями , которые возвращают int
из числа записанных байт (иногда ненужной информации) , а также error
:
if _, err := f.Read(file); err != nil {
//handle err
}
//do stuff with f
Вторая форма называется использованием оператора инициализации if .
Итак, что касается лучших практик, насколько мне известно (за исключением использования пакета «errors» для создания новых ошибок, когда они вам нужны), вы охватили почти все, что вам нужно знать об ошибках в Go!
EDIT: Если вы обнаружили , что на самом деле не может жить без исключений, вы можете имитировать их defer
, panic
иrecover
.