Я погодився би з відповіддю jnml, що вони обидва ідіоматичний код, і додати наступне:
Ваш перший приклад:
if err != nil {
//handle err
}
є більш ідіоматичним при роботі з більш ніж однією віддаченою величиною. наприклад:
val, err := someFunc()
if err != nil {
//handle err
}
//do stuff with val
Ваш другий приклад - це приємна стенограма, коли ви маєте справу лише зі errзначенням. Це застосовується, якщо функція повертає лише те error, або якщо ви навмисно ігноруєте повернуті значення, відмінні від error. Як приклад, це іноді використовується з функціями Readerта, Writerякі повертають intкількість записаних байтів (іноді непотрібна інформація) та an error:
if _, err := f.Read(file); err != nil {
//handle err
}
//do stuff with f
Друга форма називається використанням оператора if ініціалізації .
Що стосується найкращих практик, наскільки я знаю (за винятком використання пакету "помилки" для створення нових помилок, коли вони вам потрібні) ви покрили майже все, що потрібно знати про помилки Go!
EDIT: Якщо ви дійсно не можете жити без винятків, можете імітувати їх defer, panic&recover .