我有这个 Go 模板:
{{ if and $b.Trigger $b.Trigger.Name }}
Name is {{ $b.Trigger.Name }}.
{{ else }}
...other stuff...
{{ end }}
Run Code Online (Sandbox Code Playgroud)
我试图让这个模板做:
if b.Trigger != nil && $b.Trigger.Name != "" { ...
Run Code Online (Sandbox Code Playgroud)
但是它不起作用,因为正如text/template godoc所说,对和/或函数的参数都进行了评估。
当$b.Trigger.Name被评估时,它会出错,因为$b.Trigger可能为零。所以它返回错误:
template: builds.html:24:46: executing "content" at <$b.Trigger.Name>: can't evaluate field Name in type *myType
我尝试将其重构为:
{{ if and (ne $b.Trigger nil) (ne $b.Trigger.Name "") }}
Run Code Online (Sandbox Code Playgroud)
很奇怪,这也失败了,它说我无法将 $b.Trigger 与 nil 进行比较,这没有意义,因为该字段是指针类型:
template: builds.html:24:31: executing "content" at <ne $b.Trigger nil>: error calling ne: invalid type for comparison
有任何想法吗?
正如 Volker 上面指出的,嵌套 if:
{{if $b.Trigger}}{{if $b.Trigger.Name}}
Name is {{ $b.Trigger.Name }}.
{{end}}{{end}}
Run Code Online (Sandbox Code Playgroud)
或者,更简洁地说:
{{with $b.Trigger}}{{with .Name}}
Name is {{.}}.
{{end}}{{end}}
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面的内容不会处理 else 子句。这是一种(相当丑陋的)可能性:
{{$bTriggerName := ""}}
{{with $b.Trigger}}{{$bTriggerName = .Name}}{{end}}
{{with $bTriggerName}}
Name is {{.}}.
{{else}}
...other stuff...
{{end}}
Run Code Online (Sandbox Code Playgroud)
我想看看 gobuffalo/plush 是否可以更优雅地做到这一点,但截至 2019-04-30 却不能。