傳送門: 柏鏈項目學院html
模板是將一個事物的結構規律予以固定化、標準化的成果,它體現的是結構形式的標準化。對於咱們程序員來講,更直白的理解是;對於要輸出的內容,我的位置須要參數化填充,須要填充的參數位置是固定的,輸出的內容是有統一標準的。就像是咱們小時候作的填空題,題目固定,有固定的位置須要填充,模版就是原理。前端
go語言開發了專門的packge用於支持模版編程,咱們開發過程當中,有時候會碰到模版編程獲得狀況,好比想要實現自動化的輸出一些用於其餘工程執行的有效代碼,或者造成一些前端頁面,都會用到模版編程。程序員
go語言中模版編程分爲兩個大方向,一種是真的前端的,是在html/template下,還有一個是針對文本的,在text/template下,二者套路相似,咱們來講一下對於文本的處理。golang
模版編程可分爲4步:編程
咱們能夠先看官方示例給的代碼,把步驟從新認識一遍。數組
type Inventory struct { Material string Count uint } sweaters := Inventory{"wool", 17} tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}") if err != nil { panic(err) } err = tmpl.Execute(os.Stdout, sweaters) if err != nil { panic(err) }
所謂的定義模版就是Parse中的內容:數據結構
{{.Count}} items are made of {{.Material}}
template調用New以及後面的Parse就是建立模版:ui
tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}") if err != nil { panic(err) }
模版數據的準備是指結構定義和數據準備:code
type Inventory struct { Material string Count uint } sweaters := Inventory{"wool", 17}
模版執行是Execute,注意模版執行時須要指定輸出描述符(能夠是某個文件或者標準輸出,對應的go語言中的io.writer)htm
err = tmpl.Execute(os.Stdout, sweaters)
上述例子就是一個最爲簡單的模版編程,更詳盡的能夠看這裏:官方詳細資料
上述例子除了闡述模版編程的四步以外,還有一個重要信息,模版編程在執行的時候,對數據結構體有要求,模版使用{{}}包含的變量名字必須在結構體有其對應,不然執行的時候將不能成功。
下面是模版編程裏的一些actions介紹。
{{/* a comment */}} 註釋 {{pipeline}} 模版的變量 {{if pipeline}} T1 {{end}} 若是pipeline爲空,則T1不會執行, {{if pipeline}} T1 {{else}} T0 {{end}} 這是在上面的基礎上增長了else分支 {{if pipeline}} T1 {{else if pipeline}} T0 {{end}} 固然還能夠else if,這些對熟悉編程的人來講不算什麼 {{range pipeline}} T1 {{end}} 這個要求pipeline是一個數組,能夠循環輸出T1 {{range pipeline}} T1 {{else}} T0 {{end}} 這個就是pipeline爲空則執行T0 {{with pipeline}} T1 {{end}} with和if相似,若是pipeline存在,則執行T1 {{with pipeline}} T1 {{else}} T0 {{end}} 一樣的else分支處理
咱們來看一些複雜點的例子:
package main import ( "fmt" "os" "text/template" ) // Define a template. const letter = ` Dear {{.Name}}, {{if .Attended}} It was a pleasure to see you at the wedding.{{else}} It is a shame you couldn't make it to the wedding.{{end}} {{with .Gift}}Thank you for the lovely {{.}}. {{end}} Best wishes, Josie ` func main() { // Prepare some data to insert into the template. type Recipient struct { Name, Gift string Attended bool } var recipients = []Recipient{ {"Aunt Mildred", "bone china tea set", true}, {"Uncle John", "moleskin pants", false}, {"Cousin Rodney", "", false}, } // Create a new template and parse the letter into it. t := template.Must(template.New("letter").Parse(letter)) // Execute the template for each recipient. for _, r := range recipients { err := t.Execute(os.Stdout, r) if err != nil { fmt.Println("executing template:", err) } } }
上述代碼是一個寫信的模版,收信方是一個固定填充位置,Attended是一個附加信息,若是爲真,則爲受邀參加婚禮,爲假則不被邀請。Gift則是對禮物的描述,若是禮物不爲空,則該收信人會有禮物,不然沒有。
根據數據狀況recipients來看,只有第一我的受邀參加婚禮,前兩我的會有禮物,因此最終的執行結果以下:
Dear Aunt Mildred, It was a pleasure to see you at the wedding. Thank you for the lovely bone china tea set. Best wishes, Josie Dear Uncle John, It is a shame you couldn't make it to the wedding. Thank you for the lovely moleskin pants. Best wishes, Josie Dear Cousin Rodney, It is a shame you couldn't make it to the wedding. Best wishes, Josie