存储在地图中的 Html 模板在第一次调用时崩溃

我使用下面的函数在第一次调用模板时解析 Go 模板并将其保存到地图中。


随后,从地图加载模板进行优化。


// Resource ...

type Resource struct {

    Templates map[string]template.Template

}


func (res *Resource) FetchTemplate(templateName string) (template.Template, bool) {

    tmpl, ok := res.Templates[templateName]

    return tmpl, ok

}


func (res *Resource) ExecTemplate(w http.ResponseWriter, name, path string, model interface{}) error {

    t, ok := res.FetchTemplate(name)

    if !ok{

        t := template.New(name)

        t, err := t.ParseFiles(res.Assets + path)


        t = template.Must(t, err)


        if err != nil {

            return err

        }


        res.Templates[name] = *t

    }


    if err := t.Execute(w, model); err != nil {

        w.WriteHeader(http.StatusBadGateway)

        return err

    }


    return nil

}

然而,第一次在模板上调用代码时,它会在t.Execute调用时发生恐慌。


随后它总是有效。


这是错误日志。


  /usr/local/go/src/net/http/server.go:1746 +0xd0

panic(0x15b3ac0, 0x1b1c8d0)

        /usr/local/go/src/runtime/panic.go:513 +0x1b9

html/template.(*Template).escape(0xc000127088, 0x0, 0x0)

        /usr/local/go/src/html/template/template.go:95 +0x32

html/template.(*Template).Execute(0xc000127088, 0x4a90200, 0xc000374680, 0x15ed6c0, 0xc000370a20, 0x0, 0x0)

        /usr/local/go/src/html/template/template.go:119 +0x2f

git.imaxinacion.net/uoe/anssid/app/resource.(*Resource).ExecTemplate(0xc0002ee120, 0x4a901b0, 0xc000374680, 0x16577a3, 0x5, 0x1660b7a, 0x10, 0x15ed6c0, 0xc000370a20, 0x145de5e, ...)

        /Users/gbemirojiboye/go/src/git.imaxinacion.net/uoe/anssid/app/resource/resource.go:110 +0x1ef

这可能是什么原因造成的?


当我为每个调用创建新模板时,这种情况没有发生。


牧羊人nacy
浏览 123回答 1
1回答

12345678_0001

问题是t由于变量阴影,它是未定义的:t,&nbsp;ok&nbsp;:=&nbsp;res.FetchTemplate(name) if&nbsp;!ok{ &nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;:=&nbsp;template.New(name)&nbsp;//&nbsp;<----&nbsp;The&nbsp;problem&nbsp;is&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;t,&nbsp;err&nbsp;:=&nbsp;t.ParseFiles(res.Assets&nbsp;+&nbsp;path)在您的块内,您正在使用if重新定义。这意味着你有一个新的、本地范围的,一旦你离开该块,你仍然拥有外部,它仍然是“nils”。tt := ...tift将标记行更改为:&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;template.New(name)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go