在我去的代码,我经常用if这样的
if
if user && user.Registered { }
Go模板中的等效代码将是
{{ if and .User .User.Registered }} {{ end }}
不幸的是在模板代码失败,如果.User是nil:/
.User
nil
在go模板中是否可以实现相同的目的?
模板and功能不像Go 操作符那样进行短路评估&&。
and
&&
在调用and函数之前先评估函数的参数。.User.Registered即使.User为nil ,也总是对表达式求值。
.User.Registered
解决方法是使用嵌套if:
{{if .User}}{{if .User.Registered}} {{end}}{{end}}
您可以避免嵌套if或with使用模板函数:
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))
游乐场的例子