2016-01-21 5 views
6

Non riesco a trovare alcuna documentazione relativa al tipo di valore restituito quando si tenta di inserire una chiave in una mappa in cui la chiave non esiste. Dal bug tracker Go sembra essere uno speciale 'nessun valore'Operatori di confronto modello di ricerca sulla chiave di mappa mancante

Sto cercando di confrontare due valori utilizzando la funzione di eq ma dà un errore se la chiave non esiste

Esempio:

var themap := map[string]string{} 
var MyStruct := struct{MyMap map[string]string}{themap} 

{{if eq .MyMap.KeyThatDoesntExist "mystring"}} 
    {{.}} 
{{end} 

Risultati in error calling eq: invalid type for comparison

Da questo considera che il valore nullo non è la stringa vuota "" come è in sé Go.

C'è un modo semplice per confrontare un valore di mappa potenzialmente inesistente e un altro valore?

risposta

10

utilizzare la funzione Indice:

{{if eq (index .MyMap "KeyThatDoesntExist") "mystring"}} 
    {{.}} 
{{end} 

playground example

La funzione di indice restituisce il valore zero per il tipo di mappa valore quando la chiave non è nella mappa. Il valore zero per la mappa nella domanda è la stringa vuota.

+0

Una soluzione molto elegante. Grazie. – Sam

+0

Funziona anche su versioni precedenti di Go, diversamente dalla soluzione che utilizza {{if}}/{{with}} –

1

È possibile innanzitutto verificare se la chiave è nella mappa e eseguire il confronto solo se lo è. È possibile verificare con un'altra azione {{if}} o con l'azione {{with}} che imposta anche la pipeline.

Utilizzando {{with}}:

{{with .MyMap.KeyThatDoesntExist}}{{if eq . "mystring"}}Match{{end}}{{end}} 

Utilizzando un altro {{if}}:

{{if .MyMap.KeyThatDoesntExist}} 
    {{if eq .MyMap.KeyThatDoesntExist "mystring"}}Match{{end}}{{end}} 

Si noti che è possibile aggiungere {{else}} rami per coprire altri casi. Copertura completa con {{with}}:

{{with .MyMap.KeyThatDoesntExist}} 
    {{if eq . "mystring"}} 
     Match 
    {{else}} 
     No match 
    {{end}} 
{{else}} 
    Key not found 
{{end}} 

Copertura completa con {{if}}:

{{if .MyMap.KeyThatDoesntExist}} 
    {{if eq .MyMap.KeyThatDoesntExist "mystring"}} 
     Match 
    {{else}} 
     No match 
    {{end}} 
{{else}} 
    Key not found 
{{end}} 

notare che in tutta la copertura totale varianti se chiave esiste valore, ma associato è "", che sarà anche tradursi in "Key not found".

Provateli sullo Go Playground.

+0

Ottima risposta, voglio solo sottolineare un avvertimento che ho trovato. Questo non funziona se il valore della chiave è una stringa vuota. [GoPlay] (https://play.golang.org/p/C7KRIjwkXAE) –

+0

@LiamKelly Sì, hai ragione, perché il valore zero per il tipo di valore viene considerato come una condizione 'false'. La stessa cosa vale anche per l'altra risposta (accettata). – icza

Problemi correlati