首页 > 解决方案 > 在模板中使用函数而不是方法

问题描述

我使用以下代码

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

标签: go

解决方案


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

然后进入模板,您只需调用它们并传递mtsas 参数即可。

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:我的Type1

输出2:我的Type2


推荐阅读