Использование функции вместо метода в шаблоне - PullRequest
0 голосов
/ 01 мая 2018

Я использую следующий код

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 голосов
/ 03 мая 2018

Как @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...