go的template示例

时间:2024-11-05 17:20:54

模板定义:

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

注意模板中“{{”后和“}}”前的横杠“-”是用来指示删除空格空行的。