go語言的模板,text template包

2021-08-06 01:35:34 字數 4524 閱讀 3413

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

package main

import (

"os"

"text/template"

)func main() }") //建立乙個模板,內容是"hello, }"

if err != nil

err = tmpl.execute(os.stdout, name) //將string與模板合成,變數name的內容會替換掉}

//合成結果放到os.stdout裡

if err != nil

}//輸出 : hello, waynehu

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

//這句

tmpl, err := template.new("test").parse("hello, }")

//等於下面的兩句

muban := "hello, }"

tmpl, err := template.new("test").parse(muban)

//之後的例子都用兩句的方式表達

模板合成那句,第2個引數是inte***ce{},所以可以傳入任何型別,現在傳入struct看看 

要取得struct的值,只要使用成員名字即可,看**吧:

package main

import (

"os"

"text/template"

)type inventory struct

func main()

muban := "} items are made of }"

tmpl, err := template.new("test").parse(muban) //建立乙個模板

if err != nil

err = tmpl.execute(os.stdout, sweaters) //將struct與模板合成,合成結果放到os.stdout裡

if err != nil

}//輸出 : 17 items are made of wool

//乙個模板可以有多種,以name來區分

muban_eng := "} items are made of }"

muban_chn := "}做了}個專案"

//建立乙個模板的名稱是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()) //列印出english

tmpl, err = tmpl.new("china")

fmt.println(tmpl.name()) //列印出china

tmpl=tmpl.lookup("english")//必須要有返回,否則不生效

fmt.println(tmpl.name()) //列印出english

//模板可以是一行

muban := "} items are made of }"

//也可以是多行

muban := `items number is }

there made of }

`

把模板的內容發在乙個文字檔案裡,用的時候將文字檔案裡的所有內容賦值給muban這個變數即可 

上面的想法可以自己實現,但其實tamplate包已經幫我們封裝好了,那就是template.parsefiles方法

假設有乙個檔案mb.txt的內容是muban變數的內容

$cat mb.txt

} items are made of }

那麼下面2行

muban := "} items are made of }"

tmpl, err := template.new("test").parse(muban) //建立乙個模板

等價於tmpl, err := template.parsefiles("mb.txt") //建立乙個模板,這裡不需要new("name")的方式,因為name自動為檔名

parsefiles接受乙個字串,字串的內容是乙個模板檔案的路徑(絕對路徑or相對路徑) 

parseglob也差不多,是用正則的方式匹配多個檔案

假設乙個目錄裡有a.txt b.txt c.txt的話

用parsefiles需要寫3行對應3個檔案,如果有一萬個檔案呢?

而用parseglob只要寫成template.parseglob("*.txt") 即可

模板下有多套模板,其中有一套模板是當前模板 

可以使用name的方式檢視當前模板

err = tmpl.executetemplate(os.stdout, "english", sweaters)  //指定模板名,這次為english

err = tmpl.execute(os.stdout, sweaters) //模板名省略,列印的是當前模板

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

muban1 := `hi, },

hi, }

`muban2 := "我是模板2,}"

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 main

import (

"os"

"text/template"

)func main() },

hi, }

` muban2 := `我是模板2,}`

muban3 := "ha我是模板3ha!"

tmpl, err := template.new("m1").parse(muban1)

if err != nil

tmpl.new("m2").parse(muban2)

if err != nil

tmpl.new("m3").parse(muban3)

if err != nil

err = tmpl.execute(os.stdout, nil)

if err != nil

}

輸出的內容

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

hi, ha我是模板3ha!

模板檔案裡的回車也是模板的一部分,如果對回車位置控制不好,合成出來的文章會走樣 

標準庫里的example(template)寫的還是有點亂,我整理如下:

const letter = `dear },

}it was a pleasure to see you at the wedding.

如果attended是true的話,這句是第二行}it is a shame you couldn't make it to the wedding.

如果attended是false的話,這句是第二行}

}thank you for the lovely }.

}best wishes,

josie

`

解釋一下:

如果正文有多行,就等於把一行拆成多行

如下

}true line

hello true}false line

hi false}

go語言的模板,text template包

定義 模板就是將一組文字嵌入另一組文字裡 傳入string 最簡單的替換 package main import os text template func main 建立乙個模板,內容是 hello,if err nil err tmpl.execute os.stdout,name 將strin...

go語言的模板,text template包

模板就是將一組文字嵌入另一組文字裡 package main import os text template func main 建立乙個模板,內容是 hello,if err nil err tmpl.execute os.stdout,name 將string與模板合成,變數name的內容會替換...

go語言的模板,text template包

模板就是將一組文字嵌入另一組文字裡 package main import os text template func main 建立乙個模板,內容是 hello,if err nil err tmpl.execute os.stdout,name 將string與模板合成,變數name的內容會替換...