iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Modern Web

還喝不 go系列 第 17

[13th][Day17] tamplete range

range
golang 的 template 支援 range 循環來遍歷 map、slice 內的內容

{{range $i, $v := .slice}}
{{end}}

關於 點. 和 作用域
在寫template的時候,會經常用到”.”。比如{{.}}、{{len .}}、{{.Value}}、{{$x.Value}}等等。
在template中,點”.”代表當前作用域的當前物件。它類似於蠻多語言的 this 或者 self 。

template feat range
搭配 range 使用

var demoRangeString = "range start \n{{ range $key, $value :=.OneMap }} {{ $key }} ({{ $value }}) \n{{ end }}range end"


type demoRangeStruct struct {
	OneMap map[string]string
}


func main() {

    tempMap := make(map[string]string)
	tempMap["cc"] = "dd"
	tempMap["kkkey"] = "vvvalue"
	tempMap["dd"] = "dd"
	tempMap["fu"] = "ck"
	fmt.Println(tempMap)

	demoRangePointer := &demoRangeStruct{
		OneMap: tempMap,
	}
	var tpl bytes.Buffer
	t := template.Must(template.New("").Parse(demoRangeString))
	if err := t.Execute(&tpl, demoRangePointer); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(tpl.String())

輸出為

map[cc:dd dd:dd fu:ck kkkey:vvvalue]
range start
cc (dd)
dd (dd)
fu (ck)
kkkey (vvvalue)
range end

template feat slice

var demoRangeSliceString = `
{{ range $key, $value :=.OneSlice }}
{{ $key }} ({{ $value }})
		{{ end }}
`


type demoRangeSliceStruct struct {
	OneSlice []string
}


func main() {
    tempSlice := []string{"aa", "bb", "cc"}
	fmt.Println(tempSlice)

	demoRangeSlicePointer := &demoRangeSliceStruct{
		OneSlice: tempSlice,
	}
	var tpl bytes.Buffer
	t := template.Must(template.New("").Parse(demoRangeSliceString))
	if err := t.Execute(&tpl, demoRangeSlicePointer); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(tpl.String())
}

輸出為

[aa bb cc]

0 (aa)

1 (bb)

2 (cc)
在命名 demoRangeSliceString 時 我使用了 `反引號
反引號用來建立原生的字串字面量,這些字串可能由多行組成
原生字串大部份用於輸出多行訊息、HTML以及正則表示式


上一篇
[13th][Day16] tamplete
下一篇
[13th][Day18] Unmarshal
系列文
還喝不 go20

尚未有邦友留言

立即登入留言