如何与和/或在文本/模板中短路

Ahm*_*gle 6 go go-templates

我有这个 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

有任何想法吗?

Cha*_*ert 5

正如 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 却不能。