如何使用文本/模板的预定义“调用”功能?

时间:2015-07-04 07:14:52

标签: go template-engine

我正在尝试了解如何在call包中使用text/template函数。这是一个例子:

type Human struct {
    Name string
}

func (h *Human) Say(str string) string {
    return str
}

func main() {
    const letter = `
    {{.Name}} wants to say {{"blabla" | .Say}}
    {{.Name}} wants try again, {{call .Say "blabla"}}.`

    var h = &Human{"Tim"}

    t := template.Must(template.New("").Parse(letter))
    err := t.Execute(os.Stdout, h)
    if err != nil {
        log.Println("executing template:", err)
    }

}
see this code in play.golang.org


我认为call会调用函数/方法,但事实证明我们只能通过.Method arg1 arg2来完成。那么函数call的用途是什么?

2 个答案:

答案 0 :(得分:2)

如果要调用函数值,则需要使用call

引用docs(参见“功能”):

  

因此,“Go .X.Y 1 2”在Go表示法中是dot.X.Y(1,2),其中Y是a   func-valued字段,映射条目等。

在此示例中,X可能如下所示:

type X struct {
    Y func(a int, b int) int
}

答案 1 :(得分:0)

https://play.golang.org/p/usia3d8STOG

    type X struct {
        Y func(a int, b int) int
    }
    x := X{Y: func(a int, b int) int {
        return a + b
    }}
    tmpl, err := template.New("test").Parse(`{{call .X.Y 1 2}}
    `)

    if err != nil {
        panic(err)
    }
    err = tmpl.Execute(os.Stdout, map[string]interface{}{"X": x})
    if err != nil {
        panic(err)
    }