Go語言模板語法
文章目錄
- <center> Go語言模板語法
- 連接前后端的符號: `{{}}`
- 注釋
- 管道(pipeline)
- 變量
- 條件判斷
- range 關鍵字
- with 關鍵字
- 比較函數
- 自定義函數
- 嵌套模板
- 模板繼承
連接前后端的符號: {{}}
-
模板語法都包含在
{{}}
之中,其中{{.}}
中的.
表示當前對象.在傳入一個結構體對象時,可以根據"."
來訪問結構體的對應字段.如果是復合類型數據,則可以通過{{.FiledName}}
來訪問它的字段,FiledName
是指對應go代碼中的結構體變量名 -
偽代碼例子:
//在html文檔中 <body><p>Hello {{.Name}}</p><p>Gender {{.Gemder}}</p> <p>Age {{.Age}}</p> </body>//在Go代碼中 type UserInfo struct{Name stringGender stringAge int } user := &UserInfo{Name:"李四",Gender: "未知",Age: 24, }
-
這樣后端數據就傳輸到前端顯示了
注釋
- 語法:
{{/*注釋內容*/}}
- 作用: 和其他語言的注釋一致,目的是提升代碼的可閱讀性
- 注意: 可以進行多行注釋,但是不可以嵌套注釋,并且必須緊貼分界符始止
管道(pipeline)
- 介紹: 管道是指產生數據的操作,比如"{{.}}" , "{{.Name}}“等,Go語言模板語法中支持使用管道符號”|"鏈接多個指令,用法和UNIX下的管道類似,所以說管道就像一種概念,知道就行了
變量
- 介紹: 在Action里可以初始化一個變量來捕獲管道的執行結果
- Action: 在Web開發中,Action通常指代處理HTTP請求的處理程序或函數。當用戶在網頁上執行某個操作(例如點擊按鈕、提交表單)時,相應的Action會被調用來處理請求并執行相應的邏輯操作。
- 語法:
$variable := pipeline
- 特點: 聲明變量的Action不會產生任何輸出,大概意思是僅僅聲明該變量而沒有對其進行賦值或使用時,程序的輸出不會顯示該變量的值或其他信息。只有在對變量進行賦值并在程序中使用時,才能在輸出中看到相關的內容。
條件判斷
- 語法:
{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
range 關鍵字
- 在Go中使用range關鍵字,pipeline的值必須是數組,切片,字典或者通道.
- 語法:
{{range pipeline}} T1 {{end}}
{{range pipeline}} T1 {{else}} T0 {{end}}
with 關鍵字
- with關鍵字和if關鍵字有點類似,"{{with}}"操作僅在傳遞的管道不為空時有條件地執行其主體
- 語法:
{{with pipeline}} T1 {{end}}
{{with pipeline}} T1 {{else}} T0 {{end}}
比較函數
符號 | 作用 |
---|---|
eq | == |
ne | != |
lt | < |
le | <= |
gt | > |
ge | >= |
- 特點: 只有
eq
符號可以接收多個參數,它會將第一個參數和其余參數一次比較 - 例子:
{{eq arg1 arg2 arg3}} ==> arg1== arg2||arg1 == arg3
自定義函數
-
在嵌套模板中存在預定義函數(官方已經定義好的)和自定義函數(自己定義的),自定義函數使得模板更加靈活.
-
自定義函數通過調用
Funcs()
方法實現Funcs()
方法定義:func (t *Template) Funcs(funcMap FuncMap) *Template
FuncMapd
定義:type FuncMap map[string]interface{}
-
定義步驟:
-
1.先到后端代碼中定義一個函數: (匿名函數為例)
-
hello := func() (string){return "Hello!" }
-
-
2.調用
Funcs()
方法-
注意: 調用
Funcs()
方法,需要在解析模板前調用,也就是在Parse()
方法前 -
bytes,err := ioutil.ReadFile("文件名/文件路徑") templl,err := template.New("為模板命名(盡量和文件名字一致)").Funcs(template.FuncMap{"hello":hello}).Parse(string(bytes))
-
-
- 在模板中調用函數:
{{hello}}
- 這里的
hello
是指定FuncMap
中的key
,也就是上面的"hello"
-
嵌套模板
-
介紹: 嵌套模板也就是,在一個html文件中使用多個模板,被嵌套的模板可以是一個單獨的
html
文件,還可以利用define
關鍵字在該模板下定義一個模板define
語法: {{define “name”}} T(內容) {{end}}
-
通過
template
關鍵字來執行模板- 語法:
{{template "name"}}
{{template "name" pipeline}}
- 語法:
-
例子:(模板代碼)
Demo.html
-
<html><body><h1>{{template "title.html"}}</h1><div>{{template "content.html"}}</div></body> </html> {{/*define 的定義寫在html標簽之下*/}} {{define "content.html"}}<li>小明</li><li>小紅</li> {{end}}
-
title.html
文件定義-
<ul><il>你好</il> </ul>
-
-
-
后端代碼(主要):
-
tmpl,err :=template.ParseFiles("Demo.html路徑","title.html路徑")
-
在解析代碼的時候,需要將包含其他模板的文件寫在第一位,其余的可隨意順序
-
-
相關類似代碼:
-
hello.html文件
-
<p>大家好,我是小黑子</p>
-
-
Sever.html文件
-
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>嵌套模板</title> </head> <body>{{/*自定義函數加模板嵌套*/}}<h1>{{Hello}}</h1><hr><h2>{{template "hello.html"}}</h2><p>{{.}}真帥!</p><hr>{{template "come.html"}} </body> </html> {{define "come.html"}} <ul><li>唱</li><li>跳</li><li>rap</li><li>籃球</li> </ul> {{end}}
-
-
后端代碼:
-
package mainimport ("html/template""log""net/http" )func main() {http.HandleFunc("/", hello)http.ListenAndServe(":9000", nil) }func hello(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板,自定義函數Hello := func() string {return "--- 歡迎來到我的舞臺 ---"}tmpl, err := template.New("Sever.html").Funcs(template.FuncMap{"Hello": Hello}).ParseFiles("src\\使用html和template包\\Go語言模板語法\\嵌套模板\\Sever.html","src\\使用html和template包\\Go語言模板語法\\嵌套模板\\hello.html")if err != nil {log.Println("解析模板失敗!")return}name := "賢哥"//渲染模板err = tmpl.Execute(w, name)if err != nil {log.Println("渲染模板失敗!:", err)} }
-
-
這里包含了 對自定義函數,嵌套模板,以及傳值的使用
-
模板繼承
-
介紹: 模板繼承是指對各種類似的固定板塊的復用,例如說很多時候我們的開發網站的時候,其實不同的網頁很多的地方都是類似的,所以說利用模板繼承可以復用模板,減少工作量,代碼也更加簡潔
-
關鍵字
block
- 語法:
{{block "name" pipeline}} T {{end}}
- 語法:
-
需要繼承的模板,需要先繼承根模板,然后再利用define關鍵字定義內容
-
例子
-
base.tmp
文件<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>模板繼承</title> </head> <style>*{background-color:white;} </style> <body> <h1 style="color:red">模板繼承</h1> <hr> <h2 style="color:blue">變化的內容:</h2> <div>{{block "context" .}}<p>會發生變化的地方</p><div><a href="http://localhost:9000/index">Index頁面</a><br><a href="http://localhost:9000/home">Home頁面</a></div>{{end}}</div> </body> </html>
- 其中涉及一點點的
css
內容,不影響閱讀
- 其中涉及一點點的
-
index.tmpl
文件{{/*繼承根模板*/}} {{template "base.tmpl" .}} {{/*定義塊模板*/}} {{define "context"}} <h2>Index頁面</h2> <p>Hello,{{.}}</p> <a href="http://localhost:9000">Base頁面</a> {{end}}
- 先是繼承然后定義內容,其中
{{template "base.tmpl" .}}
的" . “指傳入的值,而<p>Hello,{{.}}</p>
的” . "接收該值 - 還有這里define后面的文件名,一定要與block時定義的名字一致
- 先是繼承然后定義內容,其中
-
home.tmpl
文件{{/*繼承根模板*/}} {{template "base.tmpl" .}} {{/*定義塊模板*/}} {{define "context"}}<h2>Home頁面</h2><p>Hello,{{.}}</p><a href="http://localhost:9000">Base頁面</a> {{end}}
- 和上面的基本一致
-
后端代碼
package mainimport ("html/template""log""net/http" )func main() {http.HandleFunc("/", base)http.HandleFunc("/index", index)http.HandleFunc("/home", home)err := http.ListenAndServe(":9000", nil)if err != nil {log.Println(err)return} }func base(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl")if err != nil {log.Println("解析失敗:", err)return}//渲染模板err = t.Execute(w, nil)if err != nil {log.Println("渲染失敗:", err)return} }func index(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板(涉及嵌套模板)t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl","src\\使用html和template包\\Go語言模板語法\\模板繼承\\index.tmpl")if err != nil {log.Println("解析失敗:", err)return}name := "賢哥!"//渲染模板err = t.ExecuteTemplate(w, "index.tmpl", name)if err != nil {log.Println("渲染失敗:", err)return} } func home(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl","src\\使用html和template包\\Go語言模板語法\\模板繼承\\home.tmpl")if err != nil {log.Println("解析失敗:", err)return}name := "振哥!"//渲染模板err = t.ExecuteTemplate(w, "home.tmpl", name)if err != nil {log.Println("渲染失敗:", err)return} }
-