if err != nil многим не дает покоя и энтузиасты хотят это как-то изменить ☕️Вот что они предлагают:
1) Добавить конструкцию `check/handle`
Похоже на классический try/catch. Каждую вызываемую функцию, проверяем специальным ключевым словом check. Если вернулась ошибка, то вызывается метод handle, где она уже обрабатывается.
func run() error {
handle err { return err }
check one()
check two()
check three()
return nil
}2) Добавить try/catch
Тут все как в предыдущем варианте, но часть с handle не обязательно вызывать там же где вызывали метод catch. Либо try просто пробросит ошибку на уровень выше.
func run() (err error) {
try(one())
try(two())
try(three())
return nil
}3) Добавить спецсимволы чтобы очистить синтаксис
Тут все как в примере с try, но теперь это слово заменено восклицательным знаком
func run() (err error) {
one()!
two()!
three()!
return nil
}4) Упростить if err != nil
Тут предлагают ввести тернарные операторы, чтобы сократить до одной строки
func run() error {
return record.ID == "" ? errors.New("empty id") : nil
}Либо заменить всю конструкцию
if err != nil {return err} просто знаком вопроса:func run() (err error) {
one()?
two()?
three()?
return nil
}И все они откланяются разработчиками языка: что-то похоже на defer, где-то появляется "магия", где-то ломается при оборачивании ошибок.
В итоге создатели языка решили прекратить рассмотрение и прием любых предложений в этой области - https://go.dev/blog/error-syntax.
Они подчеркивают, что ни одно из сотен предложений не получило даже близкого к единогласному одобрения сообщества 👀
Go существует 15 лет, и любое изменение расколет сообщество на тех, кто "за" и "против". В отличие от дженериков, новым синтаксисом для ошибок пришлось бы пользоваться всем.
Читать в VK
Читать в Мах
