В случае функции возврата с несколькими значениями вы не можете ссылаться на поля или методы определенного значения результата при вызове функции.
И если один из них является error
, он существует по какой-то причине (функция может выйти из строя), и вы не должны обходить его, потому что, если вы это сделаете, ваш последующий код также может потерпеть неудачу (например, привести к панике во время выполнения).
Однако могут быть ситуации, когда вы знаете, что код не выйдет из строя ни при каких обстоятельствах. В этих случаях вы можете предоставить вспомогательную функцию (или метод), которая отменит error
(или вызовет панику во время выполнения, если она все еще возникает).
Это может быть так, если вы предоставляете входные значения для функции из кода и знаете, что они работают.
Великие примеры этого являются template
и regexp
пакеты: если вы предоставить действительный шаблон или регулярное выражение во время компиляции, вы можете быть уверены , что они всегда могут быть разобраны без ошибок во время выполнения. По этой причине template
пакет предоставляет Must(t *Template, err error) *Template
функцию, а regexp
пакет предоставляет MustCompile(str string) *Regexp
функцию: они не возвращаютerror
s, потому что их предполагаемое использование - это то, где гарантированно будет действительный ввод.
Примеры:
// "text" is a valid template, parsing it will not fail
var t = template.Must(template.New("name").Parse("text"))
// `^[a-z]+\[[0-9]+\]$` is a valid regexp, always compiles
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
Вернемся к твоему делу
ЕСЛИ вы можете быть уверены, Get()
что не будет производить error
для определенных входных значений, вы можете создать вспомогательную Must()
функцию, которая не будет возвращать, error
но вызывает панику во время выполнения, если она все еще возникает:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Но вы не должны использовать это во всех случаях, только когда вы уверены, что это удастся. Использование:
val := Must(Get(1)).Value
Альтернатива / упрощение
Вы можете даже упростить его, если включите Get()
вызов в свою вспомогательную функцию, назовем ее MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Использование:
val := MustGet(1).Value
См. Некоторые интересные / связанные вопросы:
как разобрать несколько возвратов в голанге
Вернуть карту как 'ok' в Golang для обычных функций
item
обычно будетnil
в случае ошибки. Без предварительной проверки ошибки ваш код в этом случае выйдет из строя.