В случае функции возврата с несколькими значениями вы не можете ссылаться на поля или методы определенного значения результата при вызове функции.
И если один из них является error, он существует по какой-то причине (функция может выйти из строя), и вы не должны обходить его, потому что, если вы это сделаете, ваш последующий код также может потерпеть неудачу (например, привести к панике во время выполнения).
Однако могут быть ситуации, когда вы знаете, что код не выйдет из строя ни при каких обстоятельствах. В этих случаях вы можете предоставить вспомогательную функцию (или метод), которая отменит error(или вызовет панику во время выполнения, если она все еще возникает).
Это может быть так, если вы предоставляете входные значения для функции из кода и знаете, что они работают.
Великие примеры этого являются templateи regexpпакеты: если вы предоставить действительный шаблон или регулярное выражение во время компиляции, вы можете быть уверены , что они всегда могут быть разобраны без ошибок во время выполнения. По этой причине templateпакет предоставляет Must(t *Template, err error) *Templateфункцию, а regexpпакет предоставляет MustCompile(str string) *Regexpфункцию: они не возвращаютerrors, потому что их предполагаемое использование - это то, где гарантированно будет действительный ввод.
Примеры:
// "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в случае ошибки. Без предварительной проверки ошибки ваш код в этом случае выйдет из строя.