岚天逸见

go的template示例2

改进:配置类型模板化

实现代码:

package main

import (
	"os"
	"strings"
	"text/template"
	"github.com/stoewer/go-strcase"
)

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
		},
		"split": func(s, sep string) []string {
			return strings.Split(s, sep)
		},
	}

	Configs := map[string]interface{}{
		"DbConfig": map[string]string{
			"Type": "db.DbConfig",
		},
		"KafkaConsumerConfig": map[string]string{
			"Type": "kafka.KafkaConsumerConfig",
		},
		"Db1": map[string]string{
			"Type": "db.DbConfig",
		},
		"DbAa": map[string]string{
			"Type": "db.DbConfig",
		},
		"Redis": map[string]string{
			"Type": "RedisConfig",
		},
	}

	tmpl, err := template.New("a.go.tpl").Funcs(funcs).ParseFiles("./a.go.tpl")
	if err != nil {
		panic(err)
	}

	// 执行模板
	err = tmpl.Execute(os.Stdout, map[string]interface{}{
		"Configs": Configs,
	})
	if err != nil {
		panic(err)
	}
}

模板文件:

# cat a.go.tpl 
package core

{{- if gt (len .Configs) 0 }}
import (
	"github.com/kafka"
)
{{- end }}

type Config struct {
	{{- $len := len .Configs -}}
	{{- $i := 0 -}}
	{{- range $key, $value := .Configs}}
	{{- $parts := split $key "." -}}
	{{- if ge (len $parts) 2 }}
	{{title (index $parts 1)}} *{{index $value "Type"}} `yaml:"{{lower (index $parts 1)}}"`
	{{- else }}
	{{title $key}} *{{index $value "Type"}} `yaml:"{{lower $key}}"`
	{{- end }}
	{{- if lt $i (sub $len 1)}},{{end}}
	{{- $i = add $i 1 -}}
	{{- end }}
}

执行输出:

package core
import (
	"github.com/kafka"
)

type Config struct {
	Db1 *db.DbConfig `yaml:"db1"`,
	DbAa *db.DbConfig `yaml:"db_aa"`,
	DbConfig *db.DbConfig `yaml:"db_config"`,
	KafkaConsumerConfig *kafka.KafkaConsumerConfig `yaml:"kafka_consumer_config"`,
	Redis *RedisConfig `yaml:"redis"`
}

posted on 2024-11-04 19:48  岚天逸见  阅读(1)  评论(0编辑  收藏  举报

导航