我有以下工作正常的操場package mainimport ( "html/template" "os")func main() { tmpl := `{{ $slice := mkSlice "a" 5 "b" }}{{ range $slice }} {{ . }}{{ end }}` funcMap := map[string]interface{}{"mkSlice": mkSlice} t := template.New("").Funcs(template.FuncMap(funcMap)) template.Must(t.Parse(tmpl)) t.Execute(os.Stdout, nil)}func mkSlice(args ...interface{}) []interface{} { return args}但是一旦我嘗試從模板文件運行,什么都沒有顯示,也沒有收到錯誤!func mkSlice(args ...interface{}) []interface{} { // to ceate the array in the template return args}funcMap := map[string]interface{}{"mkSlice": mkSlice}tmpl := template.New("").Funcs(template.FuncMap(funcMap))template.Must(tmpl.ParseFiles("index.html"))tmpl.Execute(w, nil)并且index.html是:{{ $slice := mkSlice "a" 5 "b" }}{{ range $slice }} <span> {{ . }} </span>{{ end }}任何想法?
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
您看不到任何錯誤,因為您沒有檢查tmpl.Execute(w, nil)
. 何時檢查:
if err := t.Execute(os.Stdout, nil); err != nil { panic(err) }
您將看到如下輸出:
panic: template: "" is an incomplete or empty template
不同之處在于,在第一種情況下,您使用了Template.Parse()
以下方法:
... 將文本解析為 t 的模板主體。
請注意,您解析的模板文本將用于t
其自身!
在第二種情況下,您使用Template.ParseFiles()
了 which:
... 解析命名文件并將生成的模板與 t 相關聯。如果發生錯誤,則停止解析,返回的模板為 nil;否則為 t。必須至少有一個文件。由于 ParseFiles 創建的模板由參數文件的基本名稱命名,因此 t 通常應該具有文件的(基本)名稱之一的名稱。
因此,在您的第一個示例t
中包含一個模板,并且該單個模板將由Template.Execute()
.
在您的第二個示例t
中,包含多個關聯模板,t
它們本身是一個空模板,另一個關聯模板名為index.html
. 您可以使用以下命令執行該模板Template.ExecuteTemplate()
:
if err := t.ExecuteTemplate(os.Stdout, "index.html", nil); err != nil { panic(err) }
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消