go语言模板处理包text/template详解

这篇具有很好参考价值的文章主要介绍了go语言模板处理包text/template详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 本文对go语言内置模板处理包"text/template"常用操作汇总进行了详解,非常全面,一次搞定你的问题!还不收藏等啥呢!

目录

通用结构体定义

通用转换

1,基础操作

2,解析文件

3,自定义函数调用

4,循环遍历

5,语句、运算符、函数

6,变量与操作符文章来源地址https://www.toymoban.com/news/detail-823438.html


通用结构体定义

type Params struct {
   Field string // 取值的key名称
   Value string // 值
}

通用转换


func ConvertParams(params []Params) map[string]interface{} {
   ret := make(map[string]interface{}, 0)
   for i := range params {
      ret[params[i].Field] = params[i].Value
   }

   fmt.Printf("ret: %+v\n", ret)
   return ret
}

1,基础操作

// 目标字符串
	distStr := "name is {{.name}}, age is {{.age}}"
	// 解析列表准备
	params := []Params{{Field: "name", Value: "zhangsan"}, {Field: "age", Value: "99"}}

	// 创建template对象,并传入目标字符串进行解析
	tmpl, err := template.New("basic").Parse(distStr)
	if err != nil {
		fmt.Println("parse err: ", err)
		return
	}

	fmt.Printf("parse success: %+v\n", tmpl)

	// 将解析的模板应用于指定的数据对象,此处将params转为k-v结构并装载到buffer
	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, ConvertParams(params))
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String()) // 最终结果
	}
speed running:
parse success: &{name:basic Tree:0xc000112240 common:0xc00005c050 leftDelim: rightDelim:}
ret: map[age:99 name:zhangsan]
result:  name is zhangsan, age is 99

2,解析文件

params := []Params{{Field: "name", Value: "zhangsan"}, {Field: "age", Value: "99"}}
	// 此处New的参数必须是待解析的文件名中的一个,随意填写会报: template: x: "x" is an incomplete or empty template
	tmpl, err := template.New("demo").ParseFiles("./go_text_template/demo")
	if err != nil {
		fmt.Println("ParseFiles err: ", err)
		return
	}

	fmt.Printf("ParseFiles success: %+v\n", tmpl)
	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, ConvertParams(params))
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String())
	}
speed running:
ParseFiles success: &{name:demo Tree:0xc000118120 common:0xc00005c050 leftDelim: rightDelim:}
ret: map[age:99 name:zhangsan]
result:  name is zhangsan, age is 99

3,自定义函数调用

	// 自定义函数
	add := func(a, b int, c string) int { fmt.Println("c=", c); return a + b }

	// 创建funcMap对象,将自定义函数嵌入
	funcMap := template.FuncMap{"add": add}
	//此处注意,一定要先绑定函数
	tmpl := template.New("methodCall").Funcs(funcMap)

	// 注意函数参数之间保持空格,否则会报template: methodCall:1:52: executing "methodCall" at <add>: wrong number of args for add: want 3 got 2
	distStr := "打印入参:{{.a}}、{{.b}}、{{.c}}  计算:{{add .a .b \"c\" }}" // 若参数为字符串,形式如c
	params := []Params{{Field: "a", Value: 1}, {Field: "b", Value: 2}, {Field: "c", Value: "my val is c"}}

	var err error
	tmpl, err = tmpl.Parse(distStr)
	if err != nil {
		fmt.Println("parse err: ", err)
		return
	}

	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, ConvertParams(params))
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String())
	}
speed running:
ret: map[a:1 b:2 c:my val is c]
c= c
result:  打印入参:1、2、my val is c  计算:3

4,循环遍历

type Student struct {
	Name string
	Age  int
}

	// 待解析的模板,注意语句形成闭环,否则报错template: range:21: unexpected EOF
	distStr := ` 
第1种:单独遍历每条记录
{{range  $info := .}}
{{$info}}
{{- end}}

第2种:仅获取下标
{{range $i, $info := .}}
{{$i}}
{{- end}}

第3种:下标+每条记录
{{range $i, $info := .}}
 i: {{$i}}   info: {{$info}}
{{- end}}

第4种:得到每条记录的每个字段
{{range  $info := .}}
 name:{{$info.Name}}  age:{{$info.Age}}
{{- end}}
`
	// 数据准备
	var params []Student
	params = []Student{
		{Name: "wangwu", Age: 99}, {Name: "zhangsan", Age: 99},
	}

	tmpl, err := template.New("range").Parse(distStr)
	if err != nil {
		fmt.Println("parse err: ", err)
		return
	}

	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, params)
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String())
	}
speed running:

result:
第1种:单独遍历每条记录

{wangwu 99}
{zhangsan 99}

第2种:仅获取下标

0
1

第3种:下标+每条记录

 i: 0   info: {wangwu 99}
 i: 1   info: {zhangsan 99}

第4种:得到每条记录的每个字段

 name:wangwu  age:99
 name:zhangsan  age:99

5,语句、运算符、函数

type Student struct {
	Name        string
	Age         int
	IsJuniorStu bool
}	

	// len可获得长度,index用于以下标获取对应位置的元素,以0开始
	// if-end,if-else-end, 条件语句
	// eq,判断是否相等,相当于==,用法:{{if eq $info.Age 99}} 表示Age和99是否相等
	// lt表示<   le表示<=    gt表示>  ge表示>=   ne表示!=  eq表示==
	distStr := `
数据长度={{len .}}
0号位置的数据: {{index . 1}}
{{range  $info := .}}
name:{{$info.Name}}  age:{{$info.Age}}
	 {{if $info.IsJuniorStu}} {{$info.Name}} is a junior student
	 {{else}} println {{$info.Name}} not a junior student
     {{end}}
	 {{if eq $info.Age 99}} {{$info.Name}} 's age is 99
	 {{end}}
{{- end}}
`

	// 数据准备
	var params []Student
	params = []Student{
		{Name: "wangwu", Age: 99, IsJuniorStu: true}, {Name: "zhangsan", Age: 98, IsJuniorStu: false},
	}

	tmpl, err := template.New("range").Parse(distStr)
	if err != nil {
		fmt.Println("parse err: ", err)
		return
	}

	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, params)
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String())
	}
speed running:
result:
数据长度=2
0号位置的数据: {zhangsan 98 false}

name:wangwu  age:99
     wangwu is a junior student

     wangwu 's age is 99

name:zhangsan  age:98
     println zhangsan not a junior student

6,变量与操作符

	// 使用:=定义变量
	distStr := `
{{ $a1 := "" }}
{{ $a2 := "" }}
{{ $a3 := "ok" }}
{{ $a4 := "ok" }}
{{ $a5 := true }}
{{ $a6 := false }}
{{ $a7 := true }}
or:
{{if or $a1 $a2}}a1||a2为真{{else}}a1||a2为假{{end}}
{{if or $a1 $a3}}a1||a3为真{{else}}a1||a3为假{{end}}
{{if or $a4 $a5}}a4||a5为真{{else}}a4||a5为假{{end}}
and
{{if and $a1 $a2}}a1&&a2为真{{else}}a1&&a2为假{{end}}
{{if and $a1 $a3}}a1&&a3为真{{else}}a1&&a3为假{{end}}
{{if and $a3 $a4}}a3&&a4为真{{else}}a3&&a4为假{{end}}
{{if and $a4 $a5}}a4&&a5为真{{else}}a4&&a5为假{{end}}
{{if and $a4 $a6}}a4&&a6为真{{else}}a4&&a6为假{{end}}
取反:
a1取反={{not $a1}}
a3取反={{not $a3}}
a5取反={{not $a5}}
a6取反={{not $a6}}
`
	tmpl, err := template.New("range").Parse(distStr)
	if err != nil {
		fmt.Println("parse err: ", err)
		return
	}

	buffer := &bytes.Buffer{}
	err = tmpl.Execute(buffer, nil)
	if err != nil {
		fmt.Println("execute err: ", err)
	} else {
		fmt.Println("result: ", buffer.String())
	}
speed running:

or:
a1||a2为假
a1||a3为真
a4||a5为真
and
a1&&a2为假
a1&&a3为假
a3&&a4为真
a4&&a5为真
a4&&a6为假
取反
a1取反=true
a3取反=false
a5取反=false
a6取反=true

到了这里,关于go语言模板处理包text/template详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板

    本次教程使用的开源框架如下: 名字 开源地址 作用 Cobra 命令行工具 https://github.com/spf13/cobra Aurora 字体颜色 https://github.com/logrusorgru/aurora go-zero go-z框架 模板功能 https://github.com/zeromicro/go-zero 本项目完整源码 :https://github.com/ctra-wang/cobra-gen-drone 概述 :Cobra 是一个 Golang 包,它

    2024年02月16日
    浏览(32)
  • 什么是好的FPGA编码风格?(2)--多参考设计软件的语言模板(Language Templates)

            不论是Xilinx的Vivado,还是Altera的Quartus II,都为开发者提供了一系列Verilog、SystemVerilog、VHDL、TCL、原语、XDC约束等相关的语言模板(Language Templates)。         在Vivado软件中,按顺序点击Tools----Language Templates,即可打开设计模板界面。         在Quartus II软件中,

    2024年02月05日
    浏览(31)
  • 【Go 基础篇】Go语言包详解:模块化开发与代码复用

    在Go语言中, 包(Package) 是一种用于组织代码的机制,用于将相关的函数、类型和变量等组织在一起,以便于模块化开发和代码复用。包的使用能够使程序结构更加清晰、可维护性更高,同时也是Go语言强调的一项重要特性。本篇博客将深入探讨Go语言中包的相关知识,包括

    2024年02月11日
    浏览(27)
  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(70)
  • Go语言模板语法

    连接前后端的符号: {{}} 模板语法都包含在 {{}} 之中,其中 {{.}} 中的 . 表示当前对象.在传入一个结构体对象时,可以根据 \\\".\\\" 来访问结构体的对应字段.如果是复合类型数据,则可以通过 {{.FiledName}} 来访问它的字段, FiledName 是指对应go代码中的结构体变量名 伪代码例子: 这样后端数

    2024年02月13日
    浏览(29)
  • go语言中前端模板的使用

    一、配置直接加载静态目录 1、项目中创建一个文件夹为 assets 来存放静态目录(图片、 css 、 js ) 2、在 main.go 文件中添加以下代码 3、直接在浏览器上输入 http://localhost:8080/assets/1122.jpg 就可以访问静态目录的文件 4、如果在 gin 中使用呢 二、模板渲染 1、在项目中创建一个 vie

    2024年02月08日
    浏览(27)
  • 自然语言处理NLP:文本预处理Text Pre-Processing

    大家好,自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向,其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将介绍文本预处理的本质、原理、应用等内容,助力自然语言处理和模型的生成使用。 文本预处理是将原始文本数

    2024年04月26日
    浏览(29)
  • 浅谈WPF之控件模板Control Template和数据模板Data Template

    WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】 基本上,ControlT

    2024年02月03日
    浏览(27)
  • 从0开始python学习-47.pytest框架之解决Template替换无法进行二次处理的问题之热加载

    问题 :当参数为动态参数时,Template替换无法进行二次处理 解决方案 :通过热加载来进行替换 热加载原理 :在代码运行的过程中动态的调用python中的方法达到获得动态参数 可以进行热加载的情况 :yaml文件,随机数,替换后的值进行计算,加密等 示例: 需要热加载的数据

    2024年01月16日
    浏览(27)
  • 模板匹配Template Matching

     实现代码: 运行结果:

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包