我使用下面的函數在第一次調用模板時解析 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 +0xd0panic(0x15b3ac0, 0x1b1c8d0) /usr/local/go/src/runtime/panic.go:513 +0x1b9html/template.(*Template).escape(0xc000127088, 0x0, 0x0) /usr/local/go/src/html/template/template.go:95 +0x32html/template.(*Template).Execute(0xc000127088, 0x4a90200, 0xc000374680, 0x15ed6c0, 0xc000370a20, 0x0, 0x0) /usr/local/go/src/html/template/template.go:119 +0x2fgit.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這可能是什么原因造成的?當我為每個調用創建新模板時,這種情況沒有發生。
1 回答

12345678_0001
TA貢獻1802條經驗 獲得超5個贊
問題是t
由于變量陰影,它是未定義的:
t, ok := res.FetchTemplate(name) if !ok{ t := template.New(name) // <---- The problem is here t, err := t.ParseFiles(res.Assets + path)
在您的塊內,您正在使用if
重新定義。這意味著你有一個新的、本地范圍的,一旦你離開該塊,你仍然擁有外部,它仍然是“nils”。t
t := ...
t
if
t
將標記行更改為:
t = template.New(name)
- 1 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消