用golang寫前端 -template
ead>Go template
template模版
{{.}}是go中template的基本用法 .表示是當前物件,當我們使用結構體時,.後跟的就是結構體的欄位 ```go package main
import ( "html/template" "log" "os" )
type User struct { Name string Age string }
func templateFunc() { user := User{ "lyizriii", "22", } temp := "hello,{{.Name}},age is {{.Age}}" //模版解析 t, err := template.New("test").Parse(temp) if err != nil { log.Fatal(err) } //模版寫入 t.Execute(os.Stdout, user) }
func main() { templateFunc()
}
```
執行後我們可以在終端看到
hello,lyizriii,age is 22%
結合html使用
```html
```
```go package main
import ( "html/template" "log" "net/http" )
type User struct { Name string Age string }
func templateFunc(w http.ResponseWriter, r *http.Request) { user := User{ "lyizriii", "22", } //獲取html檔案並解析 t, err := template.ParseFiles("test.html") if err != nil { log.Fatal(err) } t.Execute(w, user) } func tempHtmlWrite() { //開啟埠 serve := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/hello", templateFunc) serve.ListenAndServe() } func main() { tempHtmlWrite() }
```
符號和空格
模版語法會講所有的符號和空格原樣儲存下來,除了需要替換的地方以外,其他都按照文字格式儲存下來,所以在非主觀意願下,請不要隨意加入空格和符號,或者是縮排,換行
{{23}} < {{45}}. -> 23 < 45 {{23}}<{{45}} -> 23<45 {{23}}< {{45}} -> 23< 45 {{23-}} < {{-45}}-> 23<45
{{...-}} {{-...}} 會去除掉後面/前面的空格
pipeline(管道)
pipeline是指產生資料的操作 我們在前面講到的{{.}}和{{.Name}}都屬於pipeline,管道中也可以像是linux命令一樣, |前面的命令會將運算結果(或返回值)傳遞給後一個命令的最後一個位置。
注意 : 並不是只有使用了|才是pipeline。Go的模板語法中,pipeline的概念是傳遞資料,只要能產生資料的,都是pipeline。
變數
Action裡可以初始化一個變數來捕獲管道的執行結果。初始化語法如下:
go
$variable := pipeline
html
{{$Name := "tom"}}
{{$Name = "kite"}}
{{$Name}}
最後頁面會顯示kite 也就是前兩行分別是定義、賦值,第三行才是展現資料
判斷
語法條件判斷一共有一下幾種 ```go {{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}} ``` 為false的情況分別是 boo值為false int為0,float為0.0,指標、介面為nil,slice,array,map,string的len為0
條件表示式
eq(equl) arg1 == arg2 ne(not equl) arg1 != arg2 lt(less then) arg1 < arg2 le(less equl) arg1 <= arg2 gt(great then) arg1 > arg2 ge(great equl) arg1 >= arg2
```html {{$Age := 18}} {{if (ge $Age 18)}}
成年人
{{else}}
未成年人
{{end}} ```
成年人
迴圈
```html
go
t, err := template.ParseFiles("test.html")
if err != nil {
log.Fatal(err)
}
s := []string{"hello,", "my name is", "lyizriii"}
t.Execute(w, s)
```
hello,my name is lyizriii
with
{{with pipeline}} T1 {{end}} 如果pipeline為empty不產生輸出,否則將dot設為pipeline的值並執行T1。不修改外面的dot。 {{with pipeline}} T1 {{else}} T0 {{end}} 如果pipeline為empty,不改變dot並執行T0,否則dot設為pipeline的值並執行T1。
html
{{with "hello"}}{{println .}}{{end}}
hello
預定義函式
執行模板時,函式從兩個函式字典中查詢:首先是模板函式字典,然後是全域性函式字典。一般不在模板內定義函式,而是使用Funcs方法新增函式到模板裡。
預定義的全域性函式如下:
go
and
函式返回它的第一個empty引數或者最後一個引數;
就是說"and x y"等價於"if x then y else x";所有引數都會執行;
or
返回第一個非empty引數或者最後一個引數;
亦即"or x y"等價於"if x then x else y";所有引數都會執行;
not
返回它的單個引數的布林值的否定
len
返回它的引數的整數型別長度
index
執行結果為第一個引數以剩下的引數為索引/鍵指向的值;
如"index x 1 2 3"返回x[1][2][3]的值;每個被索引的主體必須是陣列、切片或者字典。
print
即fmt.Sprint
printf
即fmt.Sprintf
println
即fmt.Sprintln
html
返回其引數文字表示的HTML逸碼等價表示。
urlquery
返回其引數文字表示的可嵌入URL查詢的逸碼等價表示。
js
返回其引數文字表示的JavaScript逸碼等價表示。
call
執行結果是呼叫第一個引數的返回值,該引數必須是函式型別,其餘引數作為呼叫該函式的引數;
如"call .X.Y 1 2"等價於go語言裡的dot.X.Y(1, 2);
其中Y是函式型別的欄位或者字典的值,或者其他類似情況;
call的第一個引數的執行結果必須是函式型別的值(和預定義函式如print明顯不同);
該函式型別值必須有1到2個返回值,如果有2個則後一個必須是error介面型別;
如果有2個返回值的方法返回的error非nil,模板執行會中斷並返回給呼叫模板執行者該錯誤;