Я согласен с ответом 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 .