模板定义:
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 mainimport ("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}}
}
注意模板中“{{”后和“}}”前的横杠“-”是用来指示删除空格空行的。