Go template包下面有兩個函數可以創建模板實例
func New(name string) *Template func ParseFiles(filenames ...string) (*Template, error)
首先要說的是每一個template內部可以存儲多個模板,而且每個模板必須對應一個獨立的名字。
兩個的不同點在於:
1、使用 New() 在創建時就為其添加一個模板名稱,並且執行 t.Execute() 會默認去尋找該名稱進行數據融合;
2、使用 ParseFiles() 創建模板可以一次指定多個文件加載多個模板進來,但是就不可以使用 t.Execute() 來執行數據融合;
因為使用 t.Execute() 無法找到要使用哪個加載過的模板進行數據融合,而只有New()創建時才會指定一個 t.Execute() 執行時默認加載的模板。
但是 ParseFiles() 可以通過
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
來進行數據融合,因為該函數可以指定模板名,因此,實例模板就可以知道要去加載自己內部的哪一個模板進行數據融合。
當然無論使用 New() 還是 ParseFiles() 創建模板,都是可以使用 ExecuteTemplate() 來進行數據融合,
但是對於 Execute() 一般與 New() 創建的模板進行配合使用。
html/template 和 text/template
html下的template結構體 實際上是繼承了 text 下面的 template結構體
template包下面還有一個 ParseGlob() 方法用於批量解析文件比如在當前目錄下有以h開頭的模板10個,
使用 template.ParseGlob("h*") 即可頁將10個模板文件一起解析出來。
注意事項
下面這段代碼的輸出一定為空
t := template.New("haha")
t, err := t.ParseFiles("header.tmpl")
fmt.Println(err)
t.Execute(os.Stdout, nil)
原因是為什么呢.....
首先先記住一個原則 template.New() 和 ParseFiles() 最好不要一起使用,
如果非要一起使用,那么要記住,
New("TName") 中的 TName 必須要和 header.tmpl 中定義的{{define name}}中的 name 同名。
但是正常的做法應該是這樣的,同樣的 ExecuteTemplate() 中輸入的 name 也必須和模板中 {{define name}} 相同。
t, _ := template.ParseFiles("header.tmpl")
t.ExecuteTemplate(os.Stdout, "header", nil)
這里要注意下,在這種情況下如果使用 t.Execute() 也是不會輸出任何結果的,因為他並不知道你要使用哪個模板。
另外一點要注意的就是
如果模板中沒有與填充數據對應的模板語言,那么很有可能panic。
模板中 {{}} 花括號表達式,自動實現了對js代碼的過濾,如何不過濾js代碼呢,只需要使用 text/template 包下的template,因為html/template包下的模板實現一些針對html的安全操作包括過濾js代碼。
Golang 當中支持 Pipeline,一樣是使用 |,
Go允許在模板中自定義變量,自定義模板函數。
函數定義必須遵循如下格式:
func FuncName(args ...interface{}) string
通過 template.FuncMap() 強制類型轉換為 FuncMap 類型,然后再通過 template實例的 Func(FuncMap) 添加在模板實例中,這樣該模板內部在解析時就可以使用該函數。
Go模板包中自定義了一系列內置函數:
var builtins = FuncMap{
"and": and,
"call": call,
"html": HTMLEscaper,
"index": index,
"js": JSEscaper,
"len": length,
"not": not,
"or": or,
"print": fmt.Sprint,
"printf": fmt.Sprintf,
"println": fmt.Sprintln,
"urlquery": URLQueryEscaper,
// Comparisons
"eq": eq, // ==
"ge": ge, // >=
"gt": gt, // >
"le": le, // <=
"lt": lt, // <
"ne": ne, // !=
}
摘自:
