Go 在模板中使用函数代替方法
我使用以下代码Go 在模板中使用函数代替方法,go,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
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
}
它会工作,但我想让它与第一个选项,我如何才能做到这一点?
我的意思是更新模板
更新:作为适当的回答
但是只有字符串,我怎样才能注册EchoText,正如@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
什么是mts?您将函数定义为接受mts类型的参数,但在模板中没有传递任何值,为什么?为了能够调用模板内的函数,您首先需要使用html或文本模板包提供的FuncMap注册这些函数。。。。看看如何在模板中注册和使用函数。@mkopriva-你能把它发布为答案吗?我应该采用什么…我需要它作为答案function@mkopriva-如果我有不止一个函数?我看到的是基瓦尔