当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/380774.html

相关文章:

  • python人工智能算法
  • C++:AVL树
  • docker pull 拉取镜像失败,使用Docker离线包
  • axios竟态问题
  • c++ 贪心算法
  • 电子电气架构 --- 车载诊断的快速入门
  • pdf 添加页眉页脚,获取前五页
  • JavaScript、ES6 高频重点面试题
  • 【开源免费】基于SpringBoot+Vue.JS大学生就业招聘系统(JAVA毕业设计)
  • JS装备智能化储备管理体系优化改革
  • AS技术探索
  • 设计模式之结构型模式---装饰器模式
  • ubuntu22.04 docker-compose搭建apisix高可用
  • Spring框架的事务管理
  • 868历年真题算法设计题+程序设计题
  • leetcode-3-无重复字符的最长子串
  • Pr 视频效果:过渡
  • 使用Python Flask实战构建Web应用
  • 告别传统营销,HubSpot AI分析工具带你玩转新潮流
  • BERT预训练的MLM和NSP任务的损失函数都是什么?
  • 一文快速预览经典深度学习模型(一)——CNN、RNN、LSTM、Transformer、ViT
  • 架构师之路-学渣到学霸历程-43
  • 只允许指定ip远程连接ssh
  • 【3】流程控制
  • HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(一)
  • Spring cloud