在我的执行代码中,我经常像这样使用if
if user && user.Registered { }
去模板中的等效代码将是
{{ if and .User .User.Registered }} {{ end }}
不幸的是,如果
.User
是nil
,则模板中的代码将失败:/在go模板中是否可以实现相同的目的?
最佳答案
模板and
函数不执行Got &&
运算符那样的short circuit评估。
在调用该函数之前,先评估and
函数的参数。即使.User.Registered
为nil,始终会评估表达式.User
。
解决方法是使用嵌套的if
:
{{if .User}}{{if .User.Registered}} {{end}}{{end}}
您可以使用模板函数来避免嵌套的
if
或with
: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/