Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在模板中使用函数代替方法_Go - Fatal编程技术网

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-如果我有不止一个函数?我看到的是基瓦尔