2015-10-22 4 views
5

Перейти шаблоны имеют неожиданные результаты при использовании eq с index для меня. Смотрите этот код:Перейти шаблоны с eq и индексом

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

} 

я ожидаю иметь выход

1 != 2 
2 = 2 
4 != 2 

, но я получаю

1 = 2 
2 = 2 
4 = 2 

Что я должен изменить, чтобы иметь возможность сравнить элементы массива в шаблонах их?

ответ

3

Вы используете неправильный оператор и порядок аргументов. Вы должны сначала написать оператору, а затем операнды:

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

Это более читаемым и удобным, как eq может занять больше, чем просто 2 аргументов, так что вы могли бы написать, например:

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

Для более простых многоуровневых тестов на равенство eq (only) принимает два или более аргумента и сравнивает второй и последующий с первым, возвращается в действии

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

(В отличие от || в Go, однако, эк вызов функции и все аргументы будут оценены)

С этим изменением выходной (попробуйте на Go Playground).

1 != 2 

2 = 2 

4 != 2 

Примечание:

Вы не обязаны ввести «петлю» переменную, то {{range}} действие изменяет точку на текущий элемент:

... точки устанавливаются в последовательных элементы массива, ломтик или карта ...

Таким образом, вы можете упростить ваш шаблон, это равносильно тому, ваш:

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

Также обратите внимание, что вы можете создавать переменные в шаблоне самостоятельно, что рекомендуется, если вы используете одно и то же выражение несколько раз, которое является нетривиальным (например, index . 0).Это эквивалентно также шаблона:

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

также отметить, что в данном конкретном случае, так как вещи, которые вы хотите вывести в if и else ветви и содержат = знак, вам не нужны 2 ветви, = должен быть выведен в обоих случаях, вам нужен дополнительный знак !, если они не равны. Таким образом, следующий окончательный шаблон также эквивалентен вашему:

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

 Смежные вопросы

  • Нет связанных вопросов^_^