golang模板:如何执行模板文件中的函数

不太明白模板的用法,下面注释的地方会 panic,要怎么才能执行模板文件中的函数呢?

package main

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

func testFunc() string {
    return "func1"
}

func main() {
    checkerr := func(err error) {
        if err != nil {
            fmt.Println(err)
        }
    }

    // Parse 测试:通过
    t1, err := template.New("test1").Funcs(template.FuncMap{"testFunc": testFunc}).Parse("{{testFunc}}")
    checkerr(err)

    err = t1.Execute(os.Stdout, "no data")
    checkerr(err)

    fmt.Println("\n----------")

    // ParseFiles 测试:不通过
    t2, err := template.ParseFiles("test2.tmpl") // 内容:{{testFunc}}
    checkerr(err)

    // 如何执行 test2.tmpl 中的 testFunc?
    t2 = t2.Funcs(template.FuncMap{"testFunc": testFunc}) // panic
    err = t2.Execute(os.Stdout, "no data")
    checkerr(err)
}

共 1 个回复


stevenldj

刚找到答案了
http://golangtc.com/t/5295e34f320b527679000014

func main() {
    checkerr := func(err error) {
        if err != nil {
            fmt.Println(err)
        }
    }

    // Parse 测试:通过
    t1, err := template.New("test1").Funcs(template.FuncMap{"testFunc": testFunc}).Parse("{{testFunc}}")
    checkerr(err)

    err = t1.Execute(os.Stdout, "no data")
    checkerr(err)

    fmt.Println("\n----------")

    // ParseFiles 测试:通过
    t2, err := template.New("test2.tmpl").Funcs(template.FuncMap{"testFunc": testFunc}).ParseFiles("test2.tmpl") // 内容:{{testFunc}}
    checkerr(err)

    err = t2.Execute(os.Stdout, "no data")
    checkerr(err)
}
# 0