小编典典

去模板和功能

go

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

if user && user.Registered { }

Go模板中的等效代码将是

{{ if and .User .User.Registered }} {{ end }}

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

在go模板中是否可以实现相同的目的?


阅读 282

收藏
2020-07-02

共1个答案

小编典典

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

在调用and函数之前先评估函数的参数。.User.Registered即使.User为nil ,也总是对表达式求值。

解决方法是使用嵌套if

 {{if .User}}{{if .User.Registered}}  {{end}}{{end}}

您可以避免嵌套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))

游乐场的例子

2020-07-02