В Go ошибки - это значения, возвращаемые из функций. Идиоматичный способ: проверить ошибку и при необходимости вернуть её выше или обработать.
result, err := doSomething()
if err != nil {
return err
}
// использовать result
Явная проверка вместо исключений - сознательное решение: код виден в месте вызова, нет скрытого потока управления.
f, err := os.Open(name)
if err != nil {
return fmt.Errorf("open %s: %w", name, err)
}
defer f.Close()
%w оборачивает ошибку, сохраняя цепочку для errors.Is и errors.As. В Go нет try/catch.