Trilhas
/
Go
Go
/
Programa
/
Múltiplos valores de retorno
Mú

Múltiplos valores de retorno em Go

{one: "1 exercício", many: "%{count} de exercícios", other: "%{count} exercícios"}

Sobre Múltiplos valores de retorno

As funções e os métodos em Go podem retornar vários valores:

func GetCard() (Card, error) { ... }

Cada valor de retorno precisa ser atribuído na ordem e separado por vírgulas:

card, err := GetCard()

O identificador em branco

Cada posição na atribuição declara uma variável. Em Go, não é permitido declarar uma variável sem usá-la. Use o identificador em branco _ no lugar do nome de uma variável para pular aquele valor de retorno.

card, _ := GetCard() // error intentionally ignored
_, err := GetCard()  // card ignored, only checking for error

Tratamento de erros

error é uma interface embutida. Um error nil significa que nenhum erro ocorreu; qualquer valor diferente de nil significa que algo deu errado. Por convenção, funções que podem falhar devem retornar um error como último valor. Quem chama a função precisa verificar isso antes de usar qualquer outro valor de retorno:

card, err := GetCard()
if err != nil {
    // unsafe to use card here
    return err
}
// safe to use card here

A expressão idiomática vírgula-ok

O padrão de atribuição com dois valores também aparece fora do tratamento de error. Consultas a mapas, asserções de tipo e recebimentos de canais usam todos um segundo valor Boolean, chamado ok por convenção, para indicar sucesso ou a presença de dados:

m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"]  // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int)     // ok is false
v, ok := <-ch // ok is false if ch is closed and empty

Valores de retorno nomeados

Os valores de retorno também podem receber nomes na assinatura da função. Essas variáveis ficam então acessíveis dentro do corpo da função.

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return quotient, remainder
}

Valores de retorno nomeados documentam o significado de cada posição de retorno. Eles também podem ser usados com um retorno nu, escrito sem valores. Retornos nus retornam implicitamente os valores atuais das variáveis nomeadas:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

Em funções mais longas, os retornos nus muitas vezes prejudicam a legibilidade, porque não fica claro o que está sendo retornado. Prefira valores de retorno explícitos, a menos que a função seja curta o bastante para que a assinatura esteja sempre à vista.

Para saber mais, veja Go by Example: Multiple Return Values, Effective Go: Multiple Returns ou o Tour of Go.

Editar via GitHub O link abre em uma nova janela ou aba