2015-10-22 18 views
5

I modelli Vai hanno alcuni risultati imprevisti quando si utilizza eq con index per me. Vedere questo codice:Vai modelli con eq e indice

package main 

import (
    "os" 
    "text/template" 
) 

func main() { 
    const myTemplate = ` 
{{range $n := .}} 
    {{index $n 0}} {{if (index $n 0) eq (index $n 1)}}={{else}}!={{end}} {{index $n 1}} 
{{end}} 
` 
    t := template.Must(template.New("").Parse(myTemplate)) 

    t.Execute(os.Stdout, 
     [][2]int{ 
      [2]int{1, 2}, 
      [2]int{2, 2}, 
      [2]int{4, 2}, 
     }) 

} 

mi aspetto di avere uscita

1 != 2 
2 = 2 
4 != 2 

ma ottengo

1 = 2 
2 = 2 
4 = 2 

Cosa devo cambiare per essere in grado di confrontare i membri di matrice nei modelli GO?

risposta

3

Si utilizza l'operatore e l'ordine di argomenti errati. Devi scrivere prima l'operatore e poi gli operandi:

{{if eq (index $n 0) (index $n 1)}} 

Questo è più leggibile e maneggevole come eq può prendere più di appena 2 argomenti, in modo da poter scrivere ad esempio:

{{if eq (index $n 0) (index $n 1) (index $n 2)}} 

Per semplificare i test di uguaglianza multipla, eq (solo) accetta due o più argomenti e confronta il secondo e il successivo, restituendo l'effetto

arg1==arg2 || arg1==arg3 || arg1==arg4 ... 

(A differenza di || in Go, tuttavia, eq è una chiamata di funzione e tutti gli argomenti saranno valutati)

Con questa modifica l'uscita (provate sul Go Playground):.

1 != 2 

2 = 2 

4 != 2 

Nota:

non è necessario introdurre una variabile di "loop", l'azione {{range}} cambia il punto per la voce corrente:

... dot è impostato per gli elementi successivi della serie, fetta, o MAP ...

in modo da poter semplificare il modello, questo è equivalente a vostra:

{{range .}} 
    {{index . 0}} {{if eq (index . 0) (index . 1)}}={{else}}!={{end}} {{index . 1}} 
{{end}} 

Si noti inoltre che è possibile creare variabili nel modello dall'utente, che è consigliabile se si utilizza la stessa espressione più volte che è non banale (come index . 0).Questo è anche equivalente al modello:

{{range .}}{{$0 := index . 0}}{{$1 := index . 1}} 
    {{$0}} {{if eq $0 $1}}={{else}}!={{end}} {{$1}} 
{{end}} 

Si noti inoltre che in questo caso specifico, dal momento che le cose che si vogliono in uscita nelle if e else rami contengono entrambi il segno =, non hai bisogno di 2 rami, = deve essere emesso in entrambi i casi, è sufficiente un ulteriore segno ! se non sono uguali. Quindi il seguente modello finale equivale anche al tuo:

{{range .}}{{$0 := index . 0}}{{$1 := index . 1}} 
    {{$0}} {{if ne $0 $1}}!{{end}}= {{$1}} 
{{end}}