Я только что прочитал blog, написанный Робом Пайком. У меня есть небольшой вопрос относительно этого, и может быть, я тоже ошибаюсь, но все равно хотел бы получить обратную связь и правильно разобраться с Go.Ошибки - значения (блог) - логически то же самое?
В блоге был фрагмент кода (который на самом деле был написан @jxck_)
_, err = fd.Write(p0[a:b])
if err != nil {
return err
}
_, err = fd.Write(p1[c:d])
if err != nil {
return err
}
_, err = fd.Write(p2[e:f])
if err != nil {
return err
}
// and so on
а) В соответствии с моим пониманием выше код будет вернуться, если произошла ошибка при fd.Write(p0[a:b])
, и никогда не будет выполнять fd.Write(p1[c:d])
, правильно?
И Роб предложил написать что-то вроде этого
var err error
write := func(buf []byte) {
if err != nil {
return
}
_, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
return err
}
б) Исходя из вышеизложенного, выглядит как ошибка будет возвращаться из функции к югу. Значит это означает, что если ошибка возникает при write(p0[a:b])
, то все равно она выполнит write(p1[c:d])
, правильно? Значит, это логически и то, и другое не так, верно?
Никто не объясняет.
Согласен. Теперь я понимаю :-). –
Обе версии не являются строго эквивалентными в отношении выполняемых операций, поскольку исходная версия использует ранний возврат в случае ошибки, тогда как вторая проверяет, сколько раз столько раз, сколько вызывается замыкание записи. – coredump