go語言的模板,text/template包

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

go語言的模板,text/template包

定義

模板就是將一組文本嵌入另一組文本裡

傳入string–最簡單的替換

package mainimport (    "os"    "text/template")func main() {    name := "waynehu"    tmpl, err := template.New("test").Parse("hello, {{.}}") //建立一個模板,內容是"hello, {{.}}"    if err != nil {               panic(err)    }       err = tmpl.Execute(os.Stdout, name)  //將string與模板合成,變數name的內容會替換掉{{.}}     //合成結果放到os.Stdout裡    if err != nil {            panic(err)    }   }//輸出 :   hello, waynehu

因為"hello, {{.}}"也是一個字串,所以可以單獨拎出來,如下:

//這句tmpl, err := template.New("test").Parse("hello, {{.}}")//等於下面的兩句muban := "hello, {{.}}"tmpl, err := template.New("test").Parse(muban)//之後的例子都用兩句的方式表達

傳入struct

模板合成那句,第2個參數是interface{},所以可以傳入任何類型,現在傳入struct看看
要取得struct的值,只要使用成員名字即可,看代碼吧:

package mainimport (    "os"    "text/template")type Inventory struct {    Material string    Count    uint}func main() {    sweaters := Inventory{"wool", 17}     muban := "{{.Count}} items are made of {{.Material}}"    tmpl, err := template.New("test").Parse(muban)  //建立一個模板    if err != nil {               panic(err)    }       err = tmpl.Execute(os.Stdout, sweaters) //將struct與模板合成,合成結果放到os.Stdout裡    if err != nil {            panic(err)    }   }//輸出 :   17 items are made of wool

多模板,介紹New,Name,Lookup

//一個模板可以有多種,以Name來區分muban_eng := "{{.Count}} items are made of {{.Material}}"muban_chn := "{{.Material}}做了{{.Count}}個項目"//建立一個模板的名稱是china,模板的內容是muban_chn字串tmpl, err := template.New("china")tmpl, err = tmpl.Parse(muban_chn)//建立一個模板的名稱是english,模板的內容是muban_eng字串tmpl, err = tmpl.New("english")tmpl, err = tmpl.Parse(muban_eng)//將struct與模板合成,用名字是china的模板進行合成,結果放到os.Stdout裡,內容為“wool做了17個項目”err = tmpl.ExecuteTemplate(os.Stdout, "china", sweaters)//將struct與模板合成,用名字是china的模板進行合成,結果放到os.Stdout裡,內容為“17 items are made of wool”err = tmpl.ExecuteTemplate(os.Stdout, "english", sweaters)tmpl, err = template.New("english")fmt.Println(tmpl.Name())  //列印出englishtmpl, err = tmpl.New("china")fmt.Println(tmpl.Name())  //列印出chinatmpl=tmpl.Lookup("english")//必須要有返回,否則不生效fmt.Println(tmpl.Name())  //列印出english

檔案模板,介紹ParseFiles

//模板可以是一行muban := "{{.Count}} items are made of {{.Material}}"//也可以是多行muban := `items number is {{.Count}}there made of {{.Material}}`

把模板的內容發在一個文字檔裡,用的時候將文字檔裡的所有內容賦值給muban這個變數即可
上面的想法可以自己實現,但其實tamplate包已經幫我們封裝好了,那就是template.ParseFiles方法

假設有一個檔案mb.txt的內容是muban變數的內容$cat mb.txt{{.Count}} items are made of {{.Material}}那麼下面2行muban := "{{.Count}} items are made of {{.Material}}"tmpl, err := template.New("test").Parse(muban)  //建立一個模板等價於tmpl, err := template.ParseFiles("mb.txt")  //建立一個模板,這裡不需要new("name")的方式,因為name自動為檔案名稱

檔案模板,介紹ParseGlob

ParseFiles接受一個字串,字串的內容是一個模板檔案的路徑(絕對路徑or相對路徑)
ParseGlob也差不多,是用正則的方式匹配多個檔案

假設一個目錄裡有a.txt b.txt c.txt的話用ParseFiles需要寫3行對應3個檔案,如果有一萬個檔案呢?而用ParseGlob只要寫成template.ParseGlob("*.txt") 即可

模板的輸出,介紹ExecuteTemplate和Execute

模板下有多套模板,其中有一套模板是當前模板
可以使用Name的方式查看當前模板

err = tmpl.ExecuteTemplate(os.Stdout, "english", sweaters)  //指定模板名,這次為englisherr = tmpl.Execute(os.Stdout, sweaters)  //模板名省略,列印的是當前模板

模板的複用

模板裡可以套模板,以達到複用目的,用template關鍵字

muban1 := `hi, {{template "M2"}},hi, {{template "M3"}}`muban2 := "我是模板2,{{template "M3"}}"muban3 := "ha我是模板3ha!"tmpl, err := template.New("M1").Parse(muban1)tmpl.New("M2").Parse(muban2)tmpl.New("M3").Parse(muban3)err = tmpl.Execute(os.Stdout, nil)

完整代碼:

package mainimport (    "os"    "text/template")func main() {    muban1 := `hi, {{template "M2"}},hi, {{template "M3"}}`    muban2 := `我是模板2,{{template "M3"}}`    muban3 := "ha我是模板3ha!"    tmpl, err := template.New("M1").Parse(muban1)    if err != nil {            panic(err)    }       tmpl.New("M2").Parse(muban2)    if err != nil {            panic(err)    }       tmpl.New("M3").Parse(muban3)    if err != nil {            panic(err)    }       err = tmpl.Execute(os.Stdout, nil)    if err != nil {            panic(err)    }   }

輸出的內容

hi, 我是模板2,ha我是模板3ha!,hi, ha我是模板3ha!

模板的斷行符號

模板檔案裡的斷行符號也是模板的一部分,如果對斷行符號位置控制不好,合成出來的文章會走樣
標準庫裡的Example(Template)寫的還是有點亂,我整理如下:

const letter = `Dear {{.Name}},{{if .Attended}}It was a pleasure to see you at the wedding.如果Attended是true的話,這句是第二行{{else}}It is a shame you couldn't make it to the wedding.如果Attended是false的話,這句是第二行{{end}}{{with .Gift}}Thank you for the lovely {{.}}.{{end}}Best wishes,Josie`

解釋一下:

  • Dear某某某的Dear應該是在第一行,所以在D前面不能有斷行符號,否則Dear會跑到第2行去
  • 所以Dear要緊貼\`
  • 信件的稱呼和本文有一行空行,最好顯式的打出一行,而標準庫裡的斷行符號是包在if裡,成為本文的一部分,這樣排版容易出錯
  • 正確的本文排版如下
  • 如果本文就一行,要把true和false的所有內容都寫在一行
    • 比如{{if .Attended}}true line,hello true{{else}}false line,hi false{{end}}
  • 如果本文有多行,就等於把一行拆成多行
    • 會發現true的最後一行和false的第一行是在同一行
    • {{if .Attended}}和ture的第一行在同一行
    • {{end}}和false的最後一行在同一行

如下

{{if .Attended}}true linehello true{{else}}false linehi false{{end}}
  • 關於{{with .Gift}},意思是如果Gift不是為空白的話,就列印整行,如果為空白,就不列印
    • 只有這樣寫法,with對應的end要寫在第2行,才會把“Thank you”這句後面帶一個斷行符號進去,這樣寫法,就像“Thank you”這句是插在本文下面的
    • 只有這樣寫,不管有沒有“Thank you”,本文和Best wishes,之間始終只有1行空白
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.