Я использую следующий код
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
... взгляните на этот пример, чтобы узнать, как регистрировать и использовать функции в шаблонах.
@mkopriva - не могли бы вы опубликовать это в качестве ответа, что мне следует принять ... Мне это нужно как функция
@mkopriva - а если у меня больше одной функции? и то, что я вижу, похоже на ключ val
Как предложил @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
}
Это даст следующий результат:
Input: {"myType1" "myType2"}
Output1:myType1
Output2:myType2
Что такое
mts
? Вы определили функцию как принимающую аргумент типаmts
, но в шаблоне вы не передаете ей никакого значения, почему? Кроме того, чтобы иметь возможность вызывать функции внутри шаблона, вам сначала необходимо зарегистрировать эти функции с помощьюFuncMap
, предоставляемого используемым вами пакетом шаблона (html или текст).