这是我的函数定义,它返回一个字符串
"addClassIfActive": func(tab string, ctx *web.Context) string
我正在尝试像这样打印它:
<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>
当我尝试打印时,http 响应正在终止。
我究竟做错了什么?
返回一个布尔值,然后使用 if 工作,我仍然很好奇如何打印从函数返回的字符串
这是我的函数定义,它返回一个字符串
"addClassIfActive": func(tab string, ctx *web.Context) string
我正在尝试像这样打印它:
<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>
当我尝试打印时,http 响应正在终止。
我究竟做错了什么?
返回一个布尔值,然后使用 if 工作,我仍然很好奇如何打印从函数返回的字符串
您遇到的问题是,"home"
并且.Context
将是 3:rd 和 4:th 的参数,printf
而不是addClassIfActive
. 的返回值addClassIfActive
成为 的第二个参数printf
。
但解决方案很简单:您不必使用printf
打印。
如果你的函数只返回一个字符串,你可以简单地通过编写打印它:
{{addClassIfActive "home" .Context}}
完整的工作示例:
package main
import (
"html/template"
"os"
)
type Context struct {
Active bool
}
var templateFuncs = template.FuncMap{
"addClassIfActive": func(tab string, ctx *Context) string {
if ctx.Active {
return tab + " content"
}
// Return nothing
return ""
},
}
var htmlTemplate = `{{addClassIfActive "home" .Context}}`
func main() {
data := map[string]interface{}{
"Context": &Context{true}, // Set to false will prevent addClassIfActive to print
}
// We create the template and register out template function
t := template.New("t").Funcs(templateFuncs)
t, err := t.Parse(htmlTemplate)
if err != nil {
panic(err)
}
err = t.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
输出:
家庭内容
您不能在模板中调用函数。
你可以做的是使用FuncMaps:
模板.go
var t = template.New("base")
// ParseFiles or ParseGlob, etc.
templateHelpers := template.FuncMap{
"ifactive": AddClassIfActive,
}
t = t.Funcs(templateHelpers)
your_template.tmpl
...
<span class="stuff">{{ if eq .Context | ifactive }} thing {{ else }} another thing {{ end }}</span>
...
我还没有测试过这个确切的语法,但我在其他地方使用了 FuncMaps。确保在 FuncMaps上的 text/template 上阅读更好的文档以获取更多示例。