在模板中使用函数而不是方法

时间:2018-05-01 10:52:08

标签: go

我使用以下代码

var data struct {
    File FZR
    API  API
}


const tmpl = `
    {{- range .File.Modules}}
     # in context of {{.Name}}

        echo {{.EchoText}}
    {{end}}`

func  EchoText(m mts) string {
    return m.Type
}

并且像这样不起作用,现在我将其改为

func (m mts) EchoText() string {
    return m.Type
} 

它会起作用,但我想让它与第一个选项一起工作,我该怎么办? 我的意思是更新模板......

更新:作为审批回答https://golang.org/pkg/text/template/#example_Template_func

但只有字符串,如何注册EchoText

1 个答案:

答案 0 :(得分:1)

正如@mkopriva在他的第一条评论中建议的那样,你只需要将所有函数引用到template.FuncMap,在那里建立从名称到函数的映射

然后进入模板,您只需要调用它们将mts作为参数传递给它们。

package main

import (
    "log"
    "os"
    "text/template"
)

type mts struct {
    Type1 string
    Type2 string
}

func main() {
    funcMap := template.FuncMap{
        "myFunc1": EchoType1,
        "myFunc2": EchoType2,
    }

    const templateText = `
Input: {{printf "%q" .}}
Output1:{{myFunc1 .}}
Output2:{{myFunc2 .}}
`

    tmpl, err := template.New("myFuncTest").Funcs(funcMap).Parse(templateText)
    if err != nil {
        log.Fatalf("parsing: %s", err)
    }

    myMts := mts{Type1: "myType1", Type2: "myType2"}
    err = tmpl.Execute(os.Stdout, myMts)
    if err != nil {
        log.Fatalf("execution: %s", err)
    }
}

func EchoType1(m mts) string {
    return m.Type1
}

func EchoType2(m mts) string {
    return m.Type2
}

这将产生以下输出:

  

输入:{“myType1”“myType2”}

     

输出1:myType1

     

输出2:myType2