Go 模板和自定义功能;恐慌:未定义函数

Go 模板和自定义功能;恐慌:未定义函数,go,Go,使用html/template我试图在模板中使用我自己的一个函数。不幸的是,我无法使用go模板的函数映射功能。我得到的只是以下错误: % go run test.go panic: template: tmpl.html:5: function "humanSize" not defined [...] 简化的测试用例如下所示(test.go): 我有以下简单的模板(tmpl.html): {{range.}} {{.Name} {{humanSize.Size} {{end} 这是go

使用
html/template
我试图在模板中使用我自己的一个函数。不幸的是,我无法使用go模板的函数映射功能。我得到的只是以下错误:

% go run test.go
panic: template: tmpl.html:5: function "humanSize" not defined
[...]
简化的测试用例如下所示(
test.go
):

我有以下简单的模板(
tmpl.html
):


{{range.}}
{{.Name}
{{humanSize.Size}
{{end}

这是go 1.1.1。

IIRC,在解析模板之前,模板函数映射必须由
.Funcs
定义。下面的代码似乎有效

package main

import (
        "html/template"
        "io/ioutil"
        "net/http"
        "strconv"
)

var funcMap = template.FuncMap{
        "humanSize": humanSize,
}

const tmpl = `
<html><body>
    {{range .}}
    <div>
        <span>{{.Name}}</span>
        <span>{{humanSize .Size}}</span>
    </div>
    {{end}}
</body></html>`

var tmplGet = template.Must(template.New("").Funcs(funcMap).Parse(tmpl))

func humanSize(s int64) string {
        return strconv.FormatInt(s/int64(1000), 10) + " KB"
}

func getPageHandler(w http.ResponseWriter, r *http.Request) {
        files, err := ioutil.ReadDir(".")
        if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }

        if err := tmplGet.Execute(w, files); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
        }
}

func main() {
        http.HandleFunc("/", getPageHandler)
        http.ListenAndServe(":8080", nil)
}
主程序包
进口(
“html/模板”
“io/ioutil”
“net/http”
“strconv”
)
var funcMap=template.funcMap{
“人形”:人形,
}
常数tmpl=`
{{range.}}
{{.Name}
{{humanSize.Size}
{{end}
`
var tmplGet=template.Must(template.New(“”).Funcs(funcMap.Parse(tmpl))
func humanSize(s int64)字符串{
返回strconv.formatt(s/int64(1000),10)+“KB”
}
func getPageHandler(w http.ResponseWriter,r*http.Request){
文件,错误:=ioutil.ReadDir(“.”)
如果错误!=零{
Error(w,err.Error(),http.StatusInternalServerError)
返回
}
如果错误:=tmplGet.Execute(w,文件);错误!=nil{
Error(w,err.Error(),http.StatusInternalServerError)
}
}
func main(){
http.HandleFunc(“/”,getPageHandler)
http.listendServe(“:8080”,无)
}

解决方案是在函数New()和Parse中使用相同的名称‌​@user321277建议的文件()a

var tmplGet = template.Must(template.New("base.html").Funcs(funcMap).Parse‌​Files("tmpl/base.htm‌​l", "tmpl/get.html"))

非常感谢。在解析模板之前,显然不需要添加函数映射;我在文件中找不到。最后我得到了
var tmplGet=template.Must(template.New(“base.html”).Funcs(funcMap).ParseFiles(“tmpl/base.html”、“tmpl/get.html”))
,因为我使用嵌套模板。这里的另一个问题是
New()
需要与“顶级”模板具有相同的basename。
package main

import (
        "html/template"
        "io/ioutil"
        "net/http"
        "strconv"
)

var funcMap = template.FuncMap{
        "humanSize": humanSize,
}

const tmpl = `
<html><body>
    {{range .}}
    <div>
        <span>{{.Name}}</span>
        <span>{{humanSize .Size}}</span>
    </div>
    {{end}}
</body></html>`

var tmplGet = template.Must(template.New("").Funcs(funcMap).Parse(tmpl))

func humanSize(s int64) string {
        return strconv.FormatInt(s/int64(1000), 10) + " KB"
}

func getPageHandler(w http.ResponseWriter, r *http.Request) {
        files, err := ioutil.ReadDir(".")
        if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }

        if err := tmplGet.Execute(w, files); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
        }
}

func main() {
        http.HandleFunc("/", getPageHandler)
        http.ListenAndServe(":8080", nil)
}
var tmplGet = template.Must(template.New("base.html").Funcs(funcMap).Parse‌​Files("tmpl/base.htm‌​l", "tmpl/get.html"))