用golang寫前端 -template

語言: CN / TW / HK
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

Document

Hello,{{.Name}},you age is {{.Age}}

```

```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

{{range $x := .}} {{println $x}} {{end}}

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,模板執行會中斷並返回給呼叫模板執行者該錯誤;