O que é “_,” (sublinhado, vírgula) em uma declaração Go?


100

E não consigo entender esse tipo de declaração de variável:

_, prs := m["example"]

O que exatamente " _," está fazendo e por que eles declararam uma variável como esta em vez de

prs := m["example"]

(Eu o encontrei como parte de Go by Example: Maps )


3
Para futuras questões de idioma, por favor, dê uma olhada nas especificações primeiro. Deve responder a todas as suas perguntas.
fuz

Como um comentário: prsprovavelmente significa "presente". O código em seu exemplo está verificando a presença ou ausência de uma entrada "example"no mmapa.
dyoo

6
@FUZxxl Sim, dei uma olhada lá anteriormente, mas como não sabia o nome do recurso, não o encontrei. Também acho que as especificações oficiais para linguagens de programação não são muito pedagógicas e prefiro aprender pelo exemplo.
Kansuler

@dyoo Assim que tive a explicação abaixo, descobri o significado, mas vale a pena notar se outra pessoa tiver a mesma pergunta!
Kansuler

8
@FUZxxl: Não sei. A maioria das perguntas feitas no SO provavelmente tem respostas disponíveis em algum lugar. Existe algum limite, abaixo do qual uma pergunta provavelmente não deveria ser feita, mas não acho que essa pergunta caia abaixo disso.
THB

Respostas:


120

Isso evita ter que declarar todas as variáveis ​​para os valores de retorno.
É chamado de identificador em branco .

Como em:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

(o outro _caso de uso ' ' é para importação )

Uma vez que descarta o valor de retorno, é útil quando você deseja verificar apenas um dos valores retornados, como em " Como testar a existência da chave em um mapa? " Mostrado em " Efetivo Go, map ":

_, present := timeZone[tz]

Para testar a presença no mapa sem se preocupar com o valor real, você pode usar o identificador em branco, um sublinhado simples ( _).
O identificador em branco pode ser atribuído ou declarado com qualquer valor de qualquer tipo, com o valor descartado sem causar danos.
Para testar a presença em um mapa, use o identificador em branco no lugar da variável usual para o valor.

Como Jsor adiciona nos comentários :

"padrão geralmente aceito" é chamar as variáveis ​​de teste de associação de "ok" (o mesmo para verificar se uma leitura de canal era válida ou não)

Isso permite que você combine com o teste:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Você o encontraria também em loop:

Se você precisar apenas do segundo item do intervalo (o valor), use o identificador em branco, um sublinhado, para descartar o primeiro:

sum := 0
for _, value := range array {
    sum += value
}

Obrigado por dar um bom exemplo. Levei algum pensamento para entender o conceito, mas agora eu entendo!
Kansuler

Observe que o "padrão geralmente aceito" do IME é chamar as variáveis ​​de teste de associação de "ok" (o mesmo para verificar se uma leitura de canal era válida ou não).
LinearZoetrope

1
@Jsor eu concordo. Incluí seu comentário na resposta para obter mais visibilidade e acrescentei alguns exemplos adicionais.
VonC

63

O compilador Go não permite que você crie variáveis ​​que você nunca usa.

for i, value := range x {
   total += value
}

O código acima retornará uma mensagem de erro "declarei e não usei".

Como não usamos i dentro do nosso loop, precisamos alterá-lo para:

for _, value := range x {
   total += value
}

12
Sua primeira frase foi importante para entender o motivo pelo qual existe um _ como um identificador em branco.
Tarik

4

_é o identificador em branco. Significa que o valor que deve ser atribuído é descartado.

Aqui é o valor da examplechave que é descartado. A segunda linha de código descartaria o booleano de presença e armazenaria o valor em prs.
Portanto, para apenas verificar a presença no mapa, você pode descartar o valor. Isso pode ser usado para usar um mapa como um conjunto.


3

O identificador em branco pode ser usado sempre que a sintaxe exigir um nome de variável, mas a lógica do programa não, por exemplo, para descartar um índice de loop indesejado quando exigimos apenas o valor do elemento.

Trecho de:

A linguagem de programação Go (Addison-Wesley Professional Computing Series)

Brian W. Kernighan

Este material pode estar protegido por direitos autorais.


2

É chamado de identificador em branco e ajuda nos casos em que você deseja descartar o valor que será retornado e não fazer referência a ele

Alguns lugares onde o usamos:

  • Uma função retorna um valor e você não pretende usá-lo no futuro
  • Você deseja iterar e precisa de um valor i que não usará

2

O ótimo caso de uso para a variável não utilizada é a situação em que você só precisa de uma saída parcial. No exemplo abaixo, só precisamos imprimir o valor (população do estado).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

Basicamente, é _,conhecido como identificador em branco. Em GO não podemos ter variáveis ​​que não estão sendo usadas.

Como uma instância ao iterar através de uma matriz se você estiver usando valor: = intervalo que você não quer um i valor para iterar. Mas se você omitir o valor i, ele retornará um erro. Mas se você declarar i e não usá-lo, ele também retornará um erro.

Portanto, esse é o lugar onde devemos usar _,.

Também é usado quando você não deseja o valor de retorno de uma função no futuro.


0

Uma variável não utilizada não é permitida em Golang

Se você estiver vindo de outras linguagens de programação, pode parecer um pouco difícil se acostumar com isso. Mas isso resulta em um código mais limpo. Então, ao usar um _, estamos dizendo que sabemos que há uma variável lá, mas não queremos usá-la, e estamos dizendo ao compilador que não reclama dela. :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.