Шаблон и пользовательская функция; ошибка: выполнение templName в ‹funcName› не является функцией определения

У меня есть некоторый текст, который я добавляю с помощью метода template.AddParseTree, чтобы добавить текст шаблона, но есть поведение плотины, предполагается, что метод использует его следующим образом:

singleTemplate=anyTemplate
targetTemplate=*template.Must(targetTemplate.AddParseTree(e.Name, anyTemplate.Tree))

Но не работает, когда у singleTemplate есть функция, по странной причине она работает только тогда, когда я это делаю

singleTemplate=anyTemplate
targetTemplate=*template.Must(singleTemplate.AddParseTree(e.Name, anyTemplate.Tree))

Но это не должно работать таким образом, потому что я не смогу добавить что-либо еще. Вы можете попробовать это здесь: https://play.golang.org/p/f5oXNzD1fKP

package main

import (
    "log"
    "os"
    "text/template"
)

var funcionIncremento = template.FuncMap{
    "inc": func(i int) int {
        return i + 1
    },
}

func main() {

    var strs []string
    strs = append(strs, "test1")
    strs = append(strs, "test2")
    //-----------------Not valid(it would)
    var probar1 = template.Template{}
    var auxiliar1 = template.Template{}
    auxiliar1 = *template.Must(template.New("test").Funcs(funcionIncremento).Parse(`
            {{range $index, $element := .}}
                Number: {{inc $index}}
            {{end}}
    `))

    probar1 = *template.Must(probar1.AddParseTree("test", auxiliar1.Tree))
    err := probar1.ExecuteTemplate(os.Stdout, "test", &strs)
    if err != nil {
        log.Println("Error1: ", err)
    }
//--------------------------------valid(it wouldn´t), because I wouldn´t be able to append
    var probar2 = template.Template{}
    var auxiliar2 = template.Template{}
    auxiliar2 = *template.Must(template.New("test").Funcs(funcionIncremento).Parse(`
            {{range $index, $element := .}}
                Number: {{inc $index}}
            {{end}}
    `))

    probar2 = *template.Must(auxiliar2.AddParseTree("test", auxiliar2.Tree))
    err = probar2.ExecuteTemplate(os.Stdout, "test", &strs)
    if err != nil {
        log.Println("Error2: ", err)
    }
    //-------------------------------------------
}

person John Balvin Arias    schedule 02.04.2018    source источник


Ответы (1)


a.AddParseTree("t", b.Tree) добавляет только parse.Tree шаблона b, но не добавляет функции b, потому что они не являются частью типа parse.Tree, они являются частью типа template.Template.

Любая функция, которую должен использовать b, также должна быть добавлена ​​в a.

var probar1 = template.New("pro").Funcs(funcionIncremento)
var auxiliar1 = template.New("aux").Funcs(funcionIncremento)

auxiliar1 = template.Must(auxiliar1.Parse(`
        {{range $index, $element := .}}
            Number: {{inc $index}}
        {{end}}
`))

probar1 = template.Must(probar1.AddParseTree("test", auxiliar1.Tree))
err := probar1.ExecuteTemplate(os.Stdout, "test", &strs)
if err != nil {
    log.Println("Error1: ", err)
}
person mkopriva    schedule 02.04.2018
comment
Спасибо! также, что вызывает ошибку, строка: var auxiliar1 = template.New(aux).Funcs(funcionIncremento), она не работает, потому что вы должны добавить функцию в https://play.golang.org/p/X_xhKIJVmQ4 auxiliar1 = template.Must().Funcs(funcionIncremento) - person John Balvin Arias; 02.04.2018
comment
Это не удается, потому что в этом примере вы создали новый шаблон template.New("test), у которого нет функций, и вызвали Parse для него, а не для auxiliary1, у которого уже есть функции. Смотрите это: play.golang.org/p/EIJGZ5OJqoi - person mkopriva; 02.04.2018
comment
Чтобы уточнить немного больше @JohnBalvinArias, var auxiliar1 = template.New("aux").Funcs(funcionIncremento) не вызывает ошибку, это Parse вызывает ее. Parse анализирует данную строку и каждый раз, когда она встречает функцию, например. inc он проверит, присутствует ли эта функция в template.Template, для которого был вызван Parse, и если она отсутствует, она вернет ошибку. Более четко это видно здесь: play.golang.org/p/y5m6k1TMjWK - person mkopriva; 02.04.2018