[Go] template 常用方法詳解 及 注意事項


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, // !=
}

 

 

摘自:

http://blog.csdn.net/u012807459/article/details/31531367


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM