Go --- html/template模板包的使用
這里說(shuō)的是go 語(yǔ)言中自帶的包html/template里的一些基本操作
當(dāng)然還有text/template,也是個(gè)模板包,但是這個(gè)并不是網(wǎng)頁(yè)安全的,如果 往模板上傳的是標(biāo)簽,它是會(huì)將標(biāo)簽轉(zhuǎn)成html格式的,這一般來(lái)說(shuō)是不允許的。
在本博客中所有的例子都是經(jīng)過(guò)go build,打包成可執(zhí)行文件執(zhí)行的,如果使用goland啟動(dòng)標(biāo)志其中會(huì)導(dǎo)致找不到包而報(bào)錯(cuò)。如果過(guò)真的想用啟動(dòng)標(biāo)志啟動(dòng),建議改下解析文件模板的路徑。
例子碼云地址:go-templateLearn
目錄
- 注釋
- 變量的使用
- 判斷與清楚空白符操作
- 判斷
- 去空白字符
- 循環(huán)、with和與預(yù)定義函數(shù)的使用
- 循環(huán)
- with
- 預(yù)定義函數(shù)
- 自定義函數(shù)
- 嵌套
- 填空 block
- 安全測(cè)試
- 修改默認(rèn)標(biāo)識(shí)符
- 一個(gè)簡(jiǎn)單的表單傳值的例子
## 簡(jiǎn)單使用
要使用模板需要分三個(gè)步驟,分別是定義、解析和渲染,下面咱一步一步來(lái)
定義
創(chuàng)建一個(gè).tmpl或是.tpl文件,在goland中第一次創(chuàng)建這種類(lèi)型的文件他會(huì)讓你選用什么文件的格式去提示這類(lèi)文件,這時(shí)候選擇 go template files。
-
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>測(cè)試</title> </head> <body>{{ . }}<br>{{ .name}}<br>{{ .sex}} </body> </html>其中{{ }} 是模板里的標(biāo)識(shí)符,該標(biāo)識(shí)符可能會(huì)與Vue中某些代碼沖突,后面會(huì)提供修改默認(rèn)標(biāo)識(shí)符的方法,在表示符中的 . 代表著數(shù)據(jù),這個(gè)數(shù)據(jù)是從后臺(tái)傳來(lái)的。
解析
t, err := template.ParseFiles("./test.tmpl")將剛才定義的模板文件解析到程序中,上方調(diào)用的方法是解析多個(gè)文件
解析方法
// 解析多個(gè)文件 func ParseFiles(filenames ...string) (*Template, error) {return parseFiles(nil, readFileOS, filenames...) } // 通過(guò)正則表達(dá)式解析多個(gè)文件 func ParseGlob(pattern string) (*Template, error) {return parseGlob(nil, pattern) } // 類(lèi)似于上面兩種方法,但是是從文件系統(tǒng)fs讀取,而不是主機(jī)操作系統(tǒng)的文件系統(tǒng)。 func ParseFS(fs fs.FS, patterns ...string) (*Template, error) {return parseFS(nil, fs, patterns) }渲染
mp := map[string]interface{}{"name": "張三","sex": "男",}err = t.Execute(w, mp)將數(shù)據(jù)渲染到剛解析的模板中
// 可以看出這個(gè)data是個(gè)空接口類(lèi)型,也就意味著是什么值都可以傳的 func (t *Template) Execute(wr io.Writer, data interface{}) error {if err := t.escape(); err != nil {return err}return t.text.Execute(wr, data) }另外一種渲染方法,指定模板文件進(jìn)行渲染,適用于有好多解析文件在一起時(shí)使用
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {tmpl, err := t.lookupAndEscapeTemplate(name)if err != nil {return err}return tmpl.text.Execute(wr, data) }-
main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {t, err := template.ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}mp := map[string]interface{}{"name": "張三","sex": "男",}err = t.Execute(w, mp)if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }
注釋
注釋使用的符號(hào)為{{/* */}},支持多行注釋,如
{{/*注釋內(nèi)容 */}}變量的使用
在模板中使用變量是利用 $ 符號(hào)
賦值
{{ $obj := 數(shù)據(jù) }}聲明變量之后就可以在模板文件中使用了。
例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>變量使用</title> </head> <body>MSG :{{ . }}<br>姓名 :{{ .Name }}<br>性別 : {{ .Sex }}<br> {{/* 使用變量 */}}<div>{{ $num := "123" }}年歲 :{{ $num }}</div> </body> </html>main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {t, err := template.ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.Execute(w, struct {Name stringSex string}{Name: "張三",Sex: "女",})if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }? 這里要注意一點(diǎn),就是當(dāng)傳給模板的數(shù)據(jù)為結(jié)構(gòu)體時(shí),根據(jù)go語(yǔ)言的特性,屬性名小寫(xiě)的屬性外界將獲取不到值。
判斷與清楚空白符操作
判斷
在模板中的判斷語(yǔ)句寫(xiě)法同go語(yǔ)言類(lèi)似
{{ if [比較函數(shù)] 變量 [比較對(duì)象] }}如果為真要執(zhí)行的語(yǔ)句 {{ end }}如果是只有變量的話,就判斷變量是否存在值,如果存在就執(zhí)行。
也可以使用 if … else … 語(yǔ)句,或if … else if … 語(yǔ)句,如
{{ if [比較函數(shù)] 變量 [比較對(duì)象] }}{{ else }}{{ end }} {{ if [比較函數(shù)] 變量 [比較對(duì)象] }}{{ else if [比較函數(shù)] 變量 [比較對(duì)象]}}{{ end }}去空白字符
使用
清楚變量左右兩側(cè)的空白符號(hào),當(dāng)然也可以只清除一側(cè),只需要將不需要清除的一側(cè)的 - 舍去 {{- -}}例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>判斷與清楚空白符操作</title> </head> <body>MSG :{{ . }}<br>姓名 :{{ .Name }}<br>性別 : {{ .Sex }}<br>{{ $num := .Age }}年齡 :{{ $num }} {{/* 判斷使用 注意,要先寫(xiě)條件之后跟上比較對(duì)象*/}} {{/* 比較函數(shù) eq == eq可以進(jìn)行多個(gè)值比較 如 eq n1 n2 n3 ,就會(huì)拿n1 分別跟n2,n3比較 ne != lt < le <= gt > ge >= */}}<div>{{ if lt $num 18 }}好好吃飯{{ else if ge $num 18 }}別在熬夜了{(lán){end}}</div> {{/* {{- -}} 取出空白符的符號(hào)使用*/}}{{ $num }} = {{ $num }}<br> {{/* 取出空白符,讓左側(cè)或右側(cè)能與其他的文本貼貼*/}}{{ $num -}} = {{- $num }} </body> </html>main.go
package mainimport ("fmt""html/template""net/http""os""path/filepath" )func sayHello(w http.ResponseWriter,r *http.Request) {// ./ 代表項(xiàng)目路徑t, err := template.ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.Execute(w, struct {Name stringSex stringAge int}{Name: " 張三 ",Sex: "女",Age: 20,})if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)root := filepath.Dir(os.Args[0])fmt.Println(root)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }循環(huán)、with和與預(yù)定義函數(shù)的使用
循環(huán)
使用range關(guān)鍵字進(jìn)行遍歷
這個(gè)變量只能是數(shù)組、切片、map或者通道 {{ range 變量 }}{{ end }} {{ range $index,$valuse = 變量 }}{{ end }}在range中也可以使用else語(yǔ)句,如果所遍歷的這個(gè)變量長(zhǎng)度為0,則執(zhí)行else語(yǔ)句
{{ range 變量 }}{{ else }}{{ end }}with
with的作用為重新定義 . 所代表的數(shù)據(jù),這個(gè)重新定義有一個(gè)范圍,只有在范圍內(nèi) . 才代表with重新定義的那個(gè)數(shù)據(jù)
{{ with 變量 }} 在這中間 . 都將被替換為變量的數(shù)據(jù) {{ end }}當(dāng)賦值的變量為空時(shí),可以使用 else 語(yǔ)句來(lái)檢測(cè) .有沒(méi)有被重新賦值
{{ with 變量 }}{{ else }} 如果變量為空則執(zhí)行這里的語(yǔ)句 {{ end }}預(yù)定義函數(shù)
模板中的預(yù)定義函數(shù)有:
and函數(shù)返回它的第一個(gè)empty參數(shù)或者最后一個(gè)參數(shù);就是說(shuō)"and x y"等價(jià)于"if x then y else x";所有參數(shù)都會(huì)執(zhí)行; or返回第一個(gè)非empty參數(shù)或者最后一個(gè)參數(shù);亦即"or x y"等價(jià)于"if x then x else y";所有參數(shù)都會(huì)執(zhí)行; not返回它的單個(gè)參數(shù)的布爾值的否定 len返回它的參數(shù)的整數(shù)類(lèi)型長(zhǎng)度 index執(zhí)行結(jié)果為第一個(gè)參數(shù)以剩下的參數(shù)為索引/鍵指向的值;如"index x 1 2 3"返回x[1][2][3]的值;每個(gè)被索引的主體必須是數(shù)組、切片或者字典。 print即fmt.Sprint printf即fmt.Sprintf println即fmt.Sprintln html返回與其參數(shù)的文本表示形式等效的轉(zhuǎn)義HTML。這個(gè)函數(shù)在html/template中不可用。 urlquery以適合嵌入到網(wǎng)址查詢(xún)中的形式返回其參數(shù)的文本表示的轉(zhuǎn)義值。這個(gè)函數(shù)在html/template中不可用。 js返回與其參數(shù)的文本表示形式等效的轉(zhuǎn)義JavaScript。 call執(zhí)行結(jié)果是調(diào)用第一個(gè)參數(shù)的返回值,該參數(shù)必須是函數(shù)類(lèi)型,其余參數(shù)作為調(diào)用該函數(shù)的參數(shù);如"call .X.Y 1 2"等價(jià)于go語(yǔ)言里的dot.X.Y(1, 2);其中Y是函數(shù)類(lèi)型的字段或者字典的值,或者其他類(lèi)似情況;call的第一個(gè)參數(shù)的執(zhí)行結(jié)果必須是函數(shù)類(lèi)型的值(和預(yù)定義函數(shù)如print明顯不同);該函數(shù)類(lèi)型值必須有1到2個(gè)返回值,如果有2個(gè)則后一個(gè)必須是error接口類(lèi)型;如果有2個(gè)返回值的方法返回的error非nil,模板執(zhí)行會(huì)中斷并返回給調(diào)用模板執(zhí)行者該錯(cuò)誤;例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>循環(huán),with和預(yù)定義函數(shù)的使用</title> </head> <body> {{/* 循環(huán) */}}{{ range $index,$v1 := . }}下標(biāo):{{ $index }}姓名:{{ $v1 }}<br>{{ end }} <hr> {{/* with 更改點(diǎn)的值*/}}開(kāi)始時(shí):{{ . }}<br>{{ with "斗地主研討會(huì)"}}轉(zhuǎn)換后:{{ . }}{{ end }} <hr> {{/* 預(yù)定義函數(shù) */}} {{/* and函數(shù)返回它的第一個(gè)empty參數(shù)或者最后一個(gè)參數(shù);就是說(shuō)"and x y"等價(jià)于"if x then y else x";所有參數(shù)都會(huì)執(zhí)行; or返回第一個(gè)非empty參數(shù)或者最后一個(gè)參數(shù);亦即"or x y"等價(jià)于"if x then x else y";所有參數(shù)都會(huì)執(zhí)行; not返回它的單個(gè)參數(shù)的布爾值的否定 len返回它的參數(shù)的整數(shù)類(lèi)型長(zhǎng)度 index執(zhí)行結(jié)果為第一個(gè)參數(shù)以剩下的參數(shù)為索引/鍵指向的值;如"index x 1 2 3"返回x[1][2][3]的值;每個(gè)被索引的主體必須是數(shù)組、切片或者字典。 print即fmt.Sprint printf即fmt.Sprintf println即fmt.Sprintln html返回與其參數(shù)的文本表示形式等效的轉(zhuǎn)義HTML。這個(gè)函數(shù)在html/template中不可用。 urlquery以適合嵌入到網(wǎng)址查詢(xún)中的形式返回其參數(shù)的文本表示的轉(zhuǎn)義值。這個(gè)函數(shù)在html/template中不可用。 js返回與其參數(shù)的文本表示形式等效的轉(zhuǎn)義JavaScript。 call執(zhí)行結(jié)果是調(diào)用第一個(gè)參數(shù)的返回值,該參數(shù)必須是函數(shù)類(lèi)型,其余參數(shù)作為調(diào)用該函數(shù)的參數(shù);如"call .X.Y 1 2"等價(jià)于go語(yǔ)言里的dot.X.Y(1, 2);其中Y是函數(shù)類(lèi)型的字段或者字典的值,或者其他類(lèi)似情況;call的第一個(gè)參數(shù)的執(zhí)行結(jié)果必須是函數(shù)類(lèi)型的值(和預(yù)定義函數(shù)如print明顯不同);該函數(shù)類(lèi)型值必須有1到2個(gè)返回值,如果有2個(gè)則后一個(gè)必須是error接口類(lèi)型;如果有2個(gè)返回值的方法返回的error非nil,模板執(zhí)行會(huì)中斷并返回給調(diào)用模板執(zhí)行者該錯(cuò)誤; */}}研討會(huì)人數(shù):{{ len . }} </body> </html>main.go
package mainimport ("fmt""html/template""net/http""os""path/filepath" )func sayHello(w http.ResponseWriter,r *http.Request) {// ./ 代表項(xiàng)目路徑t, err := template.ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}strings := []string{"張安","潘鳳","李翔"}err = t.Execute(w,strings)if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)root := filepath.Dir(os.Args[0])fmt.Println(root)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }自定義函數(shù)
若是覺(jué)得模板中的預(yù)定義函數(shù)不夠用,這時(shí)候就需要定義自己的函數(shù)了。
我們一般不在模板中定義自己的函數(shù),而是在渲染模板之前給定自己所定義的函數(shù),這將使用了Fancs方法。
scold := func(a string) string {return a + "TNND"} // 這個(gè)New就是用給的這個(gè)名字重新分配一個(gè)模板 // 調(diào)用Funcs方法前要先調(diào)用New方法t, err := template.New("test").Funcs(template.FuncMap{"scold" : scold}).ParseFiles("./test.tmpl")Funcs方法:
// 可以看出,在Funcs中要傳入一個(gè) map[string]interface{} , // 其中是string代表的自定義的方法在模板中叫啥名 // 第二個(gè)空接口穿的應(yīng)該是自定義的函數(shù) func (t *Template) Funcs(funcMap FuncMap) *Template {t.text.Funcs(template.FuncMap(funcMap))return t } type FuncMap map[string]interface{}在模板中使用自定義函數(shù)時(shí),要用到管道的方法
{{ a | b }} 這種寫(xiě)法的意思是將 a 的輸出通過(guò)管道再作為 b 的輸入,最后呈現(xiàn)出來(lái)的是 b 的輸出例子:
test.tmpl
{{ define "test" }} <!DOCTYPE html> <html lang="zh-CN"> <head><title>自定義函數(shù)</title> </head><body>{{/*{{ a | b }}這種寫(xiě)法的意思是將 a 的輸出通過(guò)管道再作為 b 的輸入,最后呈現(xiàn)出來(lái)的是 b 的輸出*/}}{{ . | scold }} </body> </html> {{end}}main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {scold := func(a string) string {return a + "TNND"}t, err := template.New("test").Funcs(template.FuncMap{"scold" : scold}).ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.Execute(w, "為什么不喝,")if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }嵌套
就是在一個(gè)模板中嵌套另外的一個(gè)模板。
需要使用的語(yǔ)法為
在需要嵌套的地方 {{ template 模板名 . }} 其中,這個(gè) . 是在模板中傳遞數(shù)據(jù)用的例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>嵌套</title> </head> <body>ul :<br>{{ template "ul.tmpl" . }}<hr>ol :<br>{{ template "ol.tmpl" . }} </body> </html>ol.tmpl
<ol><li>{{ .name }}</li><li>{{ .sex }}</li> </ol>ul.tmpl
<ul><li>{{ .name }}</li><li>{{ .sex }}</li> </ul>main.go
package mainimport ("fmt""html/template""net/http" )func nest(w http.ResponseWriter,r *http.Request) {// 不能寫(xiě)成template.ParseFiles("./ul.tmpl","./test.tmpl","./ol.tmpl")// 因?yàn)槭莟est.tmpl是主模板,ul.tmpl和ol.tmpl需要等主模板解析完之后在解析t, err := template.ParseFiles("./test.tmpl","./ul.tmpl","./ol.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}mp := map[string]interface{}{"name": "張大炮","sex": "女",}err = t.Execute(w, mp)if err != nil {fmt.Printf("execute file failed err := %v",err)} }func main() {http.HandleFunc("/",nest)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }填空 block
相當(dāng)于繼承,一個(gè)網(wǎng)頁(yè)項(xiàng)目會(huì)有一些公共的頁(yè)面信息,為了不每個(gè)頁(yè)面都將這些信息寫(xiě)上一邊,就要有根模板,這時(shí)候其他的頁(yè)面就需要繼承根模板。
使用block
將數(shù)據(jù)傳遞給該模板名的模板 {{ block 模板名 數(shù)據(jù)}}{{ end }}在使用時(shí)一定要引入根模板
用 . 來(lái)接受根模板傳來(lái)的所有數(shù)據(jù) {{ template 跟模板名 .}}例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>填空</title> </head> <body><div><p style="text-align: center">{{ block "content" .}}{{ end }}</p></div> </body> </html>content.tmpl
{{ template "test.tmpl" .}}{{/* 一個(gè)項(xiàng)目里面肯定要有好些個(gè)功能,如果每一個(gè)功能都有一些相同作用的文件, 這樣就很難保證這些文件不會(huì)出現(xiàn)重復(fù)的問(wèn)題, 有兩個(gè)解決方案, 1. 在每一個(gè)模板上方定義一個(gè)名字 2. 創(chuàng)建一個(gè)包,包里分層放,不同層代表著不同的功能 然后使用template.ParseGlob() 正則解析 */}} {{ define "content" }}{{ . }} {{end}}main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {t, err := template.ParseFiles("./test.tmpl","./content.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.ExecuteTemplate(w,"content", "這都是大棚的瓜")if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }安全測(cè)試
就像開(kāi)頭所說(shuō),html/template這個(gè)包傳遞給的模板的數(shù)據(jù)會(huì)進(jìn)行安全處理。
測(cè)試:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>安全測(cè)試</title> </head> <body> {{/*并不會(huì)出現(xiàn)執(zhí)行標(biāo)簽的現(xiàn)象*/}}彈窗:{{ .msg }}<br>鏈接1:{{ .a }}<br>鏈接2:{{ .a | trust }}<br> </body> </html>main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {t, err := template.New("test.tmpl").Funcs(template.FuncMap{"trust": func(s string) template.HTML {return template.HTML(s)},}).ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}m := map[string]interface{}{"msg":"<script>alert('張三攛掇著李四去王五家打了趙六')</script>","a": "<a href='https://blog.csdn.net/weixin_52025712'>本人博客</a>",}err = t.Execute(w, m)if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }修改默認(rèn)標(biāo)識(shí)符
模板中默認(rèn)標(biāo)識(shí)符 {{ }} 可能會(huì)與其他語(yǔ)言中的表示符沖突,這時(shí)候我們就要重新定義默認(rèn)標(biāo)識(shí)符,需要使用Delims方法
// 修改默認(rèn)標(biāo)識(shí)符為 [ ] t, err := template.New("test.tmpl").Delims("[","]").ParseFiles("./test.tmpl")Delims:
// left和rigth分別代表標(biāo)識(shí)符左右兩個(gè)部分 func (t *Template) Delims(left, right string) *Template {t.text.Delims(left, right)return t }例子:
test.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>修改默認(rèn)標(biāo)識(shí)符</title> </head> <body>[ . ] </body> </html>main.go
package mainimport ("fmt""html/template""net/http" )func sayHello(w http.ResponseWriter,r *http.Request) {t, err := template.New("test.tmpl").Delims("[","]").ParseFiles("./test.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.Execute(w, "hello")if err != nil {fmt.Printf("execute file failed err := %v",err)}}func main() {http.HandleFunc("/",sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }一個(gè)簡(jiǎn)單的表單傳值的例子
get.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>表單傳值</title> </head> <body><form action="/" method="post"><label><input type="text" name="name"></label><br><label><input type="text" name="age"></label><br><label><input type="radio" name="sex" value="男"></label> 男<br><label><input type="radio" name="sex" value="女"></label> 女<br><button type="submit">提交</button> </form></body> </html>post.tmpl
<!DOCTYPE html> <html lang="zh-CN"> <head><title>接受表單傳過(guò)來(lái)的值</title> </head> <body>姓名:{{ .name }}<br>性別:{{ .sex }}<br>年齡:{{ .age }} </body> </html>main.go
package mainimport ("fmt""html/template""net/http" )func form(w http.ResponseWriter,r *http.Request) {switch r.Method {case "GET":t, err := template.ParseFiles("./get.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}err = t.Execute(w, nil)if err != nil {fmt.Printf("execute file failed err := %v",err)}case "POST":t, err := template.ParseFiles("./post.tmpl")if err != nil {fmt.Printf("parse file failed err := %v",err)}name := r.FormValue("name")//fmt.Printf("name = %s\n",name)sex := r.FormValue("sex")//fmt.Printf("sex = %s\n",sex)age := r.FormValue("age")//fmt.Printf("age = %s\n",age)m := map[string]interface{}{"name":name,"sex":sex,"age":age,}err = t.Execute(w, m)if err != nil {fmt.Printf("execute file failed err := %v",err)}}}func main() {// 配置路由http.HandleFunc("/",form)// 啟動(dòng)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("listen address failed err = %v",err)} }參考文章:
李文周的博客
xyz098的簡(jiǎn)書(shū)
希望大家能多去支持一下上面的兩位大佬
最后再向大家推薦一首今天在單曲循環(huán)的歌遇見(jiàn) 西安話版 吳昊晨
總結(jié)
以上是生活随笔為你收集整理的Go --- html/template模板包的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何防止关联,求一个小号多开工具?
- 下一篇: 阳志平:思维的抽象层级-逻辑链条的起点