去模板和功能

Gor*_*nek 5 go go-templates

在我的代码中,我经常使用if这样的代码

if user && user.Registered { }
Run Code Online (Sandbox Code Playgroud)

go模板中的等效代码将是

{{ if and .User .User.Registered }} {{ end }}
Run Code Online (Sandbox Code Playgroud)

不幸的是,模板中的代码失败了,如果.Usernil:/

是否有可能在go模板中实现相同的功能?

Cer*_*món 11

模板and功能不像Go 操作员那样进行短路评估&&.

在调用and函数之前计算函数的参数..User.Registered即使.User是零,也始终评估表达式.

修复是使用嵌套的if:

 {{if .User}}{{if .User.Registered}}  {{end}}{{end}}
Run Code Online (Sandbox Code Playgroud)

您可以避免嵌套ifwith使用模板函数:

func isRegistered(u *user) bool {
  return u != nil && u.Registered
}

const tmpl = `{{if isRegistered .User}}registered{{else}}not registered{{end}}`

t := template.Must(template.New("").Funcs(template.FuncMap{"isRegistered": isRegistered}).Parse(tmpl))
Run Code Online (Sandbox Code Playgroud)

操场的例子