在我的 go 代码中,我经常像这样使用 if
if user && user.Registered { }
go 模板中的等效代码是
{{ if and .User .User.Registered }} {{ end }}
不幸的是,如果 .User
为 nil
,模板中的代码将失败:/
是否可以在 go 模板中实现相同的功能?
最佳答案
模板和
函数不做short circuit像 Go 的 &&
运算符一样的评估。
和
函数的参数在调用函数之前进行计算。表达式 .User.Registered
总是被求值,即使 .User
为 nil。
解决方法是使用嵌套的 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))
关于Go模板和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208440/