【发布时间】:2017-06-21 11:41:06
【问题描述】:
我创建了一个函数来检查是否定义了变量:
fm["isset"] = func(a interface{}) bool {
if a == nil || a == "" || a == 0 {
fmt.Println("is not set")
return false
}
fmt.Println("is set")
return false
}
tmpl := template.Must(template.New("").Funcs(fm).ParseFiles("templates/header.html"))
err := tmpl.ExecuteTemplate(w, "header", templateData)
在我的模板中:
{{ if isset .Email }}
email is set
{{ end }}
如果变量包含在templateData(这是一个包含映射和字符串的自定义结构)中,则此函数有效,但如果变量不存在,它会给我一个错误。
错误是:
executing "header" at <.Email>: can't evaluate field Email in type base.customData
在我的例子中,“base.go”是处理程序,“customData”定义为:type customData struct{..}。
我希望能够重用模板并仅在从处理程序发送某些变量时才显示某些部分。知道如何在模板端实现变量isset 检查吗?
我也尝试过使用:{{ if .Email}} do stuff {{ end }},但这也给了我同样的错误。
有什么想法吗?
【问题讨论】:
-
尝试在您的
isset函数中记录a。你看到你在传递什么吗?如果不是,则模板级别存在问题。也许尝试同时传递结构和访问它的键以检查是否 isset,并相应地修改您的函数以接受这两个参数。 -
如果我的结构包含“电子邮件”,它将起作用,并将其记录在 isset 函数中。如果结构不包含“电子邮件”(这是我的情况),它只会从上面输出错误,不会显示来自 issset 函数的日志。
-
PHP 有 isset($variable) 函数,它返回真/假,那么 GO 呢?如何检查模板中的变量以查看它是否是从处理程序发送的?例如,我只想在用户登录时显示菜单。
-
试试
{{ if .Email }},应该对你有用。 -
看看here。
标签: if-statement go struct go-templates