为了账号安全,请及时绑定邮箱和手机立即绑定

带有 eq 和 index 的模板

带有 eq 和 index 的模板

Go
四季花海 2021-11-15 20:46:12
为我使用eqwith时,Go 模板有一些意想不到的结果index。看到这个代码:package mainimport (    "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 != 22 = 24 != 2但我明白了1 = 22 = 24 = 2我应该更改什么才能比较 go 模板中的数组成员?
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

eq 是一个前缀操作:

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

游乐场:http : //play.golang.org/p/KefXH6s7N1


查看完整回答
反对 回复 2021-11-15
?
噜噜哒

TA贡献1784条经验 获得超7个赞

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


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

这更具可读性和方便性,因为它eq可以接受 2 个以上的参数,因此您可以编写例如:


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

对于更简单的多路相等性测试, eq (仅)接受两个或多个参数,并将第二个和随后的参数与第一个进行比较,返回有效


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

(然而,与 Go 中的 || 不同, eq 是一个函数调用,所有参数都将被评估。)


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


1 != 2


2 = 2


4 != 2

笔记:


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


... dot 设置为数组、切片或映射的连续元素...


所以你可以简化你的模板,这相当于你的:


{{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}}


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信