go的template示例
模板定義:
type Config struct {
{{- $len := len .DbConfigs -}}
{{- $i := 0 -}}
{{- range $key, $value := .DbConfigs}}
{{title $key}} *DbConfig ` + "`yaml:\"{{lower $key}}\"`" + `{{if lt $i (sub $len 1)}},{{end}}
{{- $i = add $i 1 -}}
{{- end}}
}
實例化模板代碼:
// filename: a.go
package main
import (
"os"
"strings"
"text/template"
"github.com/stoewer/go-strcase"
)
type DbConfig struct {
Dsn string `yaml:"dsn"` // dsn地址
Debug bool `yaml:"debug" default:"false"` // 是否打開 debug
}
func main() {
// 定義模板函數
funcs := template.FuncMap{
"title": strings.Title,
"lower": strcase.SnakeCase,
"sub": func(a, b int) int {
return a - b
},
"add": func(a, b int) int {
return a + b
},
}
// 定義模板字符串
// 注意如果是模板文件,則不需要“+”連接字符串
tmplStr := `type Config struct {
{{- $len := len .DbConfigs -}}
{{- $i := 0 -}}
{{- range $key, $value := .DbConfigs}}
{{title $key}} *DbConfig ` + "`yaml:\"{{lower $key}}\"`" + `{{if lt $i (sub $len 1)}},{{end}}
{{- $i = add $i 1 -}}
{{- end}}
}`
// 創建并解析模板
tmpl, err := template.New("config").Funcs(funcs).Parse(tmplStr)
// 如果是文件,改為 ParseFiles,如:ParseFiles("a.go.tpl")
// 注意 New 的參數必須同 ParseFiles 的保持一致,否則報錯:template: a.go: "a.go" is an incomplete or empty template
//tmpl, err := template.New("a.go.tpl").Funcs(funcs).ParseFiles("./a.go.tpl")
if err != nil {
panic(err)
}
// 定義模板數據
data := map[string]interface{}{
"DbConfigs": map[string]*DbConfig{
"Db": {
Dsn: "dsn",
Debug: false,
},
"DbTest": {
Dsn: "dsn",
Debug: false,
},
},
}
// 執行模板
err = tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
執行輸出:
# go run a.go
type Config struct {
Db *DbConfig `yaml:"db"`,
DbTest *DbConfig `yaml:"db_test"`
}
模板文件示例:
# cat a.go.tpl
package test
{{ if gt (len .DbConfigs) 0 }}{{/*這是一個條件判斷,只有當 .DbConfigs 的長度大于 0 時,才會執行接下來的代碼*/}}
import (
"github.com/aaa/bbb"
)
{{- end }}
type Config struct {
{{- $len := len .DbConfigs -}}{{/*變量定義,$len 是 .DbConfigs 的長度*/}}
{{- $i := 0 -}}{{/*變量定義,$i 是一個計數器,用于追蹤當前處理的是 .DbConfigs 中的第幾個元素*/}}
{{- range $key, $value := .DbConfigs}}{{/*這是一個循環,對 .DbConfigs 中的每個元素進行處理*/}}
{{title $key}} *DbConfig `yaml:"{{lower $key}}"`{{if lt $i (sub $len 1)}},{{end}}{{/*如果‘i小于$len - 1`,那么在字段后面添加一個逗號*/}}
{{- $i = add $i 1 -}}{{/*更新計數器 $i 的代碼,將 $i 的值加 1*/}}
{{- end}}
}
注意模板中“{{”后和“}}”前的橫杠“-”是用來指示刪除空格空行的。
浙公網安備 33010602011771號