Вообще говоря, если функция не выполнила задачу, ее возвращаемое значение следует рассматривать как ненадежное.Поскольку ошибки в go являются значениями, вызывающая сторона может игнорировать возвращаемую ошибку.Например:
foo := myType{
Bar: 123,
Foo: "some string",
}
b, _ := json.Marshal(foo)
Я игнорирую ошибку, потому что это тип, который я создал, и я знаю, что его можно маршалировать.Тем не менее, это считается плохой практикой в любом случае.Тем не менее, теперь представьте, что кто-то вызывает вашу функцию:
slice, _ := mayError()
И ваша функция после добавления 2-х элементов к срезу выдает ошибки.Возврат частичного среза может и, вероятно, приведет к некорректному поведению в дальнейшем.Это затрудняет отладку кода.В целом, я бы сказал, что в этом случае лучше вернуть нулевой срез и ошибку.Если код выглядит следующим образом:
slice, _ := mayError() // returns nil, someErr
// panic
if slice[0] != "" {
}
По крайней мере, ошибка появляется немедленно, и вы увидите, что любые ошибки, возвращаемые mayError
, игнорируются.Это облегчает отладку, поддержку и исправление кода.