Использование функции вместо метода в шаблоне

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

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

Что такое mts? Вы определили функцию как принимающую аргумент типа mts, но в шаблоне вы не передаете ей никакого значения, почему? Кроме того, чтобы иметь возможность вызывать функции внутри шаблона, вам сначала необходимо зарегистрировать эти функции с помощью FuncMap, предоставляемого используемым вами пакетом шаблона (html или текст).

mkopriva 01.05.2018 13:23

... взгляните на этот пример, чтобы узнать, как регистрировать и использовать функции в шаблонах.

mkopriva 01.05.2018 13:26

@mkopriva - не могли бы вы опубликовать это в качестве ответа, что мне следует принять ... Мне это нужно как функция

Jenny Hilton 01.05.2018 13:28

@mkopriva - а если у меня больше одной функции? и то, что я вижу, похоже на ключ val

Jenny Hilton 01.05.2018 13:32
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
4
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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
}

Это даст следующий результат:

Input: {"myType1" "myType2"}

Output1:myType1

Output2:myType2

Другие вопросы по теме