如何打印函数的返回值?

时间:2014-01-29 06:52:48

标签: go go-templates

这是我的函数定义,它返回一个字符串

"addClassIfActive": func(tab string, ctx *web.Context) string

我正试图像这样打印:

<a href="/home/"{{ printf "%s" addClassIfActive "home" .Context }}>Home</a>

当我正在尝试打印时,http响应正在终止。

我做错了什么?

返回一个布尔值,然后使用if工作,我仍然很好奇如何打印从函数返回的字符串

2 个答案:

答案 0 :(得分:4)

您遇到的问题是"home".Context将是printf的第3和第4个参数,而不是addClassIfActive的参数。 addClassIfActive的返回值成为printf的2:nd参数。

但解决方案很简单:您不必使用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)
    }

}

<强>输出:

  

家庭内容

Playground

答案 1 :(得分:0)

您无法在模板中调用函数。

可以做的是使用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>
...

我没有测试过这种确切的语法,但我在其他地方使用FuncMaps。请务必阅读FuncMaps上的better docs at text/template以获取更多示例。