带eq和索引的Go模板

带eq和索引的Go模板,go,go-templates,Go,Go Templates,对于我来说,在使用eq和index时,Go模板会产生一些意想不到的结果。请参阅此代码: 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}

对于我来说,在使用
eq
index
时,Go模板会产生一些意想不到的结果。请参阅此代码:

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

我应该更改什么才能比较go模板中的数组成员?

eq
是一种前缀操作:

{{if eq (index $n 0) (index $n 1)}}={{else}}!={{end}}

操场:。

您使用了错误的运算符和参数顺序。必须先写入运算符,然后写入操作数:

{{if eq (index $n 0) (index $n 1)}}
这更具可读性和方便性,因为
eq
可以接受两个以上的参数,因此您可以编写以下示例:

{{if eq (index $n 0) (index $n 1) (index $n 2)}}
对于更简单的多路相等性测试,eq(仅)接受两个或多个参数,并比较第二个参数和第一个参数之后的参数,返回有效值

arg1==arg2 || arg1==arg3 || arg1==arg4 ...
(但是,与Go中的| |不同,eq是一个函数调用,所有参数都将被计算。)

通过此更改,输出(在上尝试):

注意:

不需要引入“循环”变量,
{{range}
操作将点更改为当前项:

…点设置为数组、切片或贴图的连续元素

因此,您可以简化模板,这相当于您的模板:

{{range .}}
    {{index . 0}} {{if eq (index . 0) (index . 1)}}={{else}}!={{end}} {{index . 1}}
{{end}}
{{range .}}{{$0 := index . 0}}{{$1 := index . 1}}
    {{$0}} {{if ne $0 $1}}!{{end}}= {{$1}}
{{end}}
还请注意,您可以自己在模板中创建变量,如果多次使用相同的表达式(例如
index.0
),建议您这样做。这也相当于您的模板:

{{range .}}{{$0 := index . 0}}{{$1 := index . 1}}
    {{$0}} {{if eq $0 $1}}={{else}}!={{end}} {{$1}}
{{end}}
还请注意,在这种特定情况下,由于要在
if
else
分支中输出的内容都包含
=
符号,因此不需要两个分支,
=
在这两种情况下都需要输出,您只需要额外的
符号,如果它们不相等。因此,以下最终模板也相当于您的模板:

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