No caso de uma função de retorno de vários valores, você não pode se referir a campos ou métodos de um valor específico do resultado ao chamar a função.
E se um deles for um error
, ele está lá por um motivo (que é a função pode falhar) e você não deve ignorá-lo porque, se o fizer, seu código subsequente também pode falhar miseravelmente (por exemplo, resultando em pânico no tempo de execução).
No entanto, pode haver situações em que você sabe que o código não falhará em nenhuma circunstância. Nesses casos, você pode fornecer uma função auxiliar (ou método) que descartará o error
(ou gerará um pânico de tempo de execução, se ainda ocorrer).
Esse pode ser o caso se você fornecer os valores de entrada para uma função a partir do código e souber que eles funcionam.
Ótimos exemplos disso são os pacotes template
e regexp
: se você fornecer um modelo ou regexp válido em tempo de compilação, você pode ter certeza de que eles sempre podem ser analisados sem erros em tempo de execução. Por esse motivo, o template
pacote fornece a Must(t *Template, err error) *Template
função e o regexp
pacote fornece os s, porque o uso pretendido é onde a entrada tem garantia de validade.MustCompile(str string) *Regexp
função: eles não retornamerror
Exemplos:
// "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]+\]$`)
De volta ao seu caso
SE você tiver certeza de Get()
que não produzirá error
para determinados valores de entrada, pode criar uma Must()
função auxiliar que não retornaria o, error
mas geraria um pânico de tempo de execução se ainda ocorrer:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Mas você não deve usar isso em todos os casos, apenas quando tiver certeza de que funciona. Uso:
val := Must(Get(1)).Value
Alternativa / Simplificação
Você pode até simplificar ainda mais se incorporar a Get()
chamada à sua função auxiliar, vamos chamá-la MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Uso:
val := MustGet(1).Value
Veja algumas questões interessantes / relacionadas:
como analisar retornos múltiplos em golang
Retorna o mapa como 'ok' no Golang nas funções normais
item
normalmente ocorreránil
em caso de erro. Sem verificar se há um erro primeiro, seu código irá travar nesse caso.