В C и аналогичных языках функции обычно возвращают значения, такие как -1 или ноль, чтобы сигнализировать об ошибках или пропущенных результатах:
// Lookup возвращает значение для ключа или "",
// если нет соответствия для ключа.
func Lookup(key string) string
// Невозможность проверить значение внутренней ошибки
// может привести к багам:
Parse(Lookup(key))
// возвращает "parse failure for value"
// вместо "no value for key"
Поддержка Go нескольких возвращаемых значений обеспечивает лучшее решение. Вместо того, чтобы требовать, чтобы клиенты проверяли значение ошибки внутри, функция должна возвращать дополнительное значение, чтобы указать, являются ли ее другие возвращаемые значения действительными. Это возвращаемое значение может быть ошибкой или логическим значением, когда объяснение не требуется. Это должно быть окончательное возвращаемое значение.
// Lookup возвращает значение для ключа или ok = false,
// если для ключа нет соответствия.
func Lookup(key string) (value string, ok bool)
Это препятствует тому, чтобы вызывающая сторона использовала результат неправильно:
Parse(Lookup(key)) // compile-time error
И поощряет более надежный и читаемый код:
value, ok := Lookup(key)
if !ok {
return fmt.Errorf("no value for %q", key)
}
return Parse(value)
Это правило применяется к экспортируемым функциям, но также полезно для неэкспортируемых функций.
Возвращаемые значения, такие как nil, "", 0 и -1, хороши, когда они являются действительными результатами для функции, то есть когда вызывающей стороне нет необходимости обрабатывать их иначе, чем другие значения.
Некоторые стандартные библиотечные функции, такие как те, что в пакете "strings", возвращают значения внутренних ошибок. Это значительно упрощает код манипуляции со строками за счет требования большего усердия от программиста. В общем, Go код должен возвращать дополнительные значения для ошибок.
Читайте также:
Комментариев нет:
Отправить комментарий