在我的代码中,我经常使用if
这样的代码
if user && user.Registered { }
Run Code Online (Sandbox Code Playgroud)
go模板中的等效代码将是
{{ if and .User .User.Registered }} {{ end }}
Run Code Online (Sandbox Code Playgroud)
不幸的是,模板中的代码失败了,如果.User
是nil
:/
是否有可能在go模板中实现相同的功能?
Cer*_*món 11
模板and
功能不像Go 操作员那样进行短路评估&&
.
在调用and
函数之前计算函数的参数..User.Registered
即使.User
是零,也始终评估表达式.
修复是使用嵌套的if
:
{{if .User}}{{if .User.Registered}} {{end}}{{end}}
Run Code Online (Sandbox Code Playgroud)
您可以避免嵌套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))
Run Code Online (Sandbox Code Playgroud)