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

if user && user.Registered { }

去模板中的等效代码将是
{{ if and .User .User.Registered }} {{ end }}

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

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

最佳答案

模板and函数不执行Got &&运算符那样的short circuit评估。

在调用该函数之前,先评估and函数的参数。即使.User.Registered为nil,始终会评估表达式.User

解决方法是使用嵌套的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))

playground example

关于go - 去模板和功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42208440/

10-11 20:34