英文:
How do I print return value of a function?
问题
这是我的函数定义,它返回一个字符串:
"addClassIfActive": func(tab string, ctx *web.Context) string
我试图这样打印它:
<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>
当我尝试打印时,HTTP响应被终止。
我做错了什么?
返回一个布尔值,然后使用if语句可以工作,但我还是想知道如何打印函数返回的字符串。
英文:
Here is my function definition which returns a string
"addClassIfActive": func(tab string, ctx *web.Context) string
I'm trying to print it like this:
<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>
http response is getting terminated when I'm trying to print.
What am I doing wrong?
Returning a boolean, and then using if works, still I'm curious how to print string returned from a function
答案1
得分: 4
你遇到的问题是"home"
和.Context
将成为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 ""
},
}
var htmlTemplate = `{{addClassIfActive "home" .Context}}`
func main() {
data := map[string]interface{}{
"Context": &Context{true}, // 如果设置为false,将阻止addClassIfActive打印
}
// 创建模板并注册模板函数
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)
}
}
输出:
home content
英文:
The problem you have is that "home"
and .Context
will be the 3:rd and 4:th argument of printf
and not the arguments of addClassIfActive
. The return value of addClassIfActive
becomes the 2:nd argument for printf
.
But the solution is simple: you don't have to use printf
to print.
If your function just returns a string, you can simply print it by writing:
{{addClassIfActive "home" .Context}}
Full working example:
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)
}
}
Output:
>home content
答案2
得分: 0
你可以在模板中调用函数。
你可以使用FuncMaps来实现:
templates.go
var t = template.New("base")
// ParseFiles或ParseGlob等
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。请确保阅读text/template的更好文档以获取更多示例。
英文:
You can't call functions in templates.
What you can do is use FuncMaps:
templates.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>
...
I haven't tested this exact syntax, but I am using FuncMaps elsewhere. Make sure to read the better docs at text/template on FuncMaps for more examples.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论