我使用以下代码
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
答案 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