Che cos'è "_" (trattino basso virgola) in una dichiarazione Go?


100

E non riesco a capire questo tipo di dichiarazione di variabile:

_, prs := m["example"]

Che cosa " _," sta facendo esattamente e perché hanno dichiarato una variabile come questa invece di

prs := m["example"]

(L'ho trovato come parte di Go by Example: Maps )


3
Per future domande sulla lingua, consulta prima le specifiche . Dovrebbe rispondere a tutte le tue domande.
fuz

Come commento: prsprobabilmente sta per "presente". Il codice nel tuo esempio sta verificando la presenza o l'assenza di una voce per "example"nella mmappa.
dyoo

6
@FUZxxl Sì, ho dato un'occhiata lì in precedenza, ma poiché non conoscevo il nome della funzione, non l'ho trovata. Inoltre trovo che le specifiche ufficiali per i linguaggi di programmazione non siano molto pedagogiche e piuttosto imparino con l'esempio.
Kansuler

@dyoo Una volta che ho avuto la spiegazione di seguito ho capito che significa, ma vale la pena notare se qualcun altro ha la stessa domanda!
Kansuler

8
@ FUZxxl: non lo so. La maggior parte delle domande poste su SO probabilmente hanno risposte disponibili da qualche parte. Esiste una soglia al di sotto della quale probabilmente non dovrebbe essere posta una domanda, ma non credo che questa domanda cada al di sotto.
gio

Risposte:


121

Evita di dover dichiarare tutte le variabili per i valori di ritorno.
Si chiama identificatore del vuoto .

Come in:

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

(l' altro ' _' caso d'uso è per l'importazione )

Poiché ignora il valore restituito, è utile quando si desidera controllare solo uno dei valori restituiti, come in " Come testare l'esistenza di una chiave in una mappa? " Mostrato in " Effective Go, map ":

_, present := timeZone[tz]

Per verificare la presenza nella mappa senza preoccuparsi del valore effettivo, è possibile utilizzare l'identificatore vuoto, un semplice trattino basso ( _).
L'identificatore del vuoto può essere assegnato o dichiarato con qualsiasi valore di qualsiasi tipo, con il valore scartato in modo innocuo.
Per verificare la presenza in una mappa, utilizzare l'identificatore vuoto al posto della normale variabile per il valore.

Come aggiunge Jsor nei commenti :

"standard generalmente accettato" è chiamare "ok" le variabili di test di appartenenza (lo stesso per controllare se un canale letto era valido o meno)

Ciò ti consente di combinarlo con il test:

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

Lo troverai anche in loop:

Se hai bisogno solo del secondo elemento nell'intervallo (il valore), utilizza l'identificatore vuoto, un trattino basso, per eliminare il primo:

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

Grazie per aver dato il buon esempio. Mi ci è voluto un po 'di tempo per capire il concetto, ma ora lo faccio!
Kansuler

Si noti che l'IME "standard generalmente accettato" consiste nel chiamare "ok" le variabili di test di appartenenza (lo stesso per controllare se un canale letto era valido o meno).
LinearZoetrope

1
@ Jsor sono d'accordo. Ho incluso il tuo commento nella risposta per una maggiore visibilità e ho aggiunto alcuni esempi aggiuntivi.
VonC

64

Il compilatore Go non ti consentirà di creare variabili che non usi mai.

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

Il codice precedente restituirà un messaggio di errore "ho dichiarato e non utilizzato".

Dato che non usiamo i all'interno del nostro ciclo, dobbiamo cambiarlo in questo:

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

13
La tua prima frase era importante per capire il motivo per cui è presente un _ come identificatore vuoto.
Tarik

4

_è l'identificatore vuoto. Significa che il valore che dovrebbe essere assegnato viene scartato.

Qui è il valore della examplechiave che viene scartato. La seconda riga di codice scarterebbe il booleano di presenza e memorizzerebbe il valore in prs.
Quindi, per controllare solo la presenza nella mappa, puoi scartare il valore. Può essere utilizzato per utilizzare una mappa come set.


3

L'identificatore vuoto può essere utilizzato ogni volta che la sintassi richiede un nome di variabile ma la logica del programma non lo fa, ad esempio per scartare un indice di loop indesiderato quando è richiesto solo il valore dell'elemento.

Estratto da:

The Go Programming Language (Addison-Wesley Professional Computing Series)

Brian W. Kernighan

Questo materiale può essere protetto da copyright.


2

Si chiama identificatore vuoto e aiuta nei casi in cui desideri scartare il valore che verrà restituito e non fare riferimento ad esso

Alcuni luoghi in cui lo usiamo:

  • Una funzione restituisce un valore e non intendi utilizzarlo in futuro
  • Vuoi iterare e hai bisogno di un valore i che non utilizzerai

1

Fondamentalmente, _,noto come identificatore vuoto. In GO non possiamo avere variabili che non vengono utilizzate.

Ad esempio, quando si esegue l'iterazione attraverso un array se si utilizza value: = range non si desidera un valore i per l'iterazione. Ma se ometti il ​​valore i, verrà restituito un errore. Ma se dichiari i e non l'hai usato, restituirà anche un errore.

Pertanto, questo è il luogo in cui dobbiamo usare _,.

Inoltre viene utilizzato quando non si desidera il valore restituito da una funzione in futuro.


1

Il grande caso d'uso per la variabile inutilizzata è la situazione in cui è necessario solo un output parziale. Nell'esempio seguente abbiamo solo bisogno di stampare il valore (popolazione statale).

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

0

Una variabile non utilizzata non è consentita in Golang

Se provenivi da altri linguaggi di programmazione, potrebbe sembrare difficile abituarsi a questo. Ma questo si traduce in un codice più pulito. Quindi, usando a _stiamo dicendo che sappiamo che c'è una variabile lì ma non vogliamo usarla e diciamo al compilatore che non me ne lamenta. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.