2015-10-22 16 views
5

Gehen Vorlagen haben einige unerwartete Ergebnisse bei der Verwendung eq mit index für mich. Sehen Sie diesen Code:Go Vorlagen mit eq und Index

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}, 
     }) 

} 

Ich erwarte Ausgang

1 != 2 
2 = 2 
4 != 2 

haben, aber ich

1 = 2 
2 = 2 
4 = 2 

Was sollte ich in der Lage sein zu ändern Array Mitglieder in go-Vorlagen zu vergleichen?

Antwort

3

Sie verwenden falsche Operator- und Argumentreihenfolge. Sie müssen zuerst den Operator schreiben und dann die Operanden:

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

Dies ist besser lesbar und handlich wie eq mehr als nur zwei Argumente nehmen kann, so könnten Sie zum Beispiel schreiben:

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

Für einfachere Mehrweg-Gleichheitsprüfungen akzeptiert eq (nur) zwei oder mehr Argumente und vergleicht das zweite und das folgende mit dem ersten und gibt in der Folge

arg1==arg2 || arg1==arg3 || arg1==arg4 ... 
zurück

(Im Gegensatz zu || in Go ist jedoch eq ein Funktionsaufruf und alle Argumente bewertet werden)

Mit dieser Änderung der Ausgang (versuchen Sie es auf dem Go Playground).

1 != 2 

2 = 2 

4 != 2 

Hinweis:

Sie sind nicht eine „Schleife“ Variable einzuführen erforderlich, die {{range}} Aktion den Punkt auf das aktuelle Element ändert:

... Punkt zu den aufeinanderfolgenden Elemente des Arrays, Scheibe festgelegt ist, oder eine Karte ...

So können Sie Ihre Vorlage vereinfachen, ist dies gleichbedeutend mit Ihnen:

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

Beachten Sie auch, dass Sie Variablen in der Vorlage selbst erstellen können. Dies wird empfohlen, wenn Sie denselben Ausdruck mehrfach verwenden, der nicht trivial ist (z. B. index . 0).Dies ist auch gleichbedeutend mit Ihrer Vorlage:

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

auch beachten, dass in diesem speziellen Fall, da die Dinge, die Sie ausgeben möchten in den if und else Zweige sowohl die = Zeichen enthalten, brauchen Sie nicht 2 Zweige, = muss in beiden Fällen ausgegeben werden, Sie brauchen nur ein extra ! Zeichen, wenn sie nicht gleich sind. Die folgende endgültige Vorlage entspricht also Ihrer:

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