首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模板和自定义函数;死机:函数未定义

模板和自定义函数;死机:函数未定义
EN

Stack Overflow用户
提问于 2013-07-25 03:35:34
回答 2查看 12.7K关注 0票数 23

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

代码语言:javascript
复制
% go run test.go
panic: template: tmpl.html:5: function "humanSize" not defined
[...]

简化的测试用例如下所示(test.go):

代码语言:javascript
复制
package main

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

var funcMap = template.FuncMap{
    "humanSize": humanSize,
}
var tmplGet = template.Must(template.ParseFiles("tmpl.html")).Funcs(funcMap)

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

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

func main() {
    http.HandleFunc("/", getPageHandler)
    http.ListenAndServe(":8080", nil)
}

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

代码语言:javascript
复制
<html><body>
    {{range .}}
    <div>
        <span>{{.Name}}</span>
        <span>{{humanSize .Size}}</span>
    </div>
    {{end}}
</body></html>

这是go 1.1.1。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-25 04:22:17

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

代码语言:javascript
复制
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)
}
票数 36
EN

Stack Overflow用户

发布于 2018-01-19 15:36:36

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

代码语言:javascript
复制
var tmplGet = template.Must(template.New("base.html").Funcs(funcMap).Parse‌​Files("tmpl/base.htm‌​l", "tmpl/get.html"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17843311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档