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