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

GO 语言进阶之 Template 模板使用

更多个人笔记见:
github个人笔记仓库
gitee 个人笔记仓库
个人学习,学习过程中还会不断补充~ (后续会更新在github上)

文章目录

  • Template 模板
    • 基本示例
    • 语法
      • 1. 基本输出语法
      • 2. 控制结构
      • 3. 空白字符控制
      • 4. Must函数

Template 模板

基本示例

package mainimport ("fmt""html/template""os"
)// 定义数据结构
type Person struct {Name    stringAge     intEmail   stringIsAdmin bool
}type Company struct {Name      stringEmployees []PersonFounded   int
}func main() {// 示例1:基本语法演示basicTemplateDemo()// 示例2:条件判断和循环conditionalAndLoopDemo()// 示例3:HTML模板htmlTemplateDemo()// 示例4:Must的使用mustTemplateDemo()
}// 基本语法演示
func basicTemplateDemo() {fmt.Println("=== 基本语法演示 ===")// {{.}} 表示当前数据对象tmpl1 := `Hello {{.}}!`t1 := template.Must(template.New("basic").Parse(tmpl1))t1.Execute(os.Stdout, "World")fmt.Println()// {{.Name}} 访问结构体字段person := Person{Name: "张三", Age: 30, Email: "zhangsan@example.com"}tmpl2 := `姓名: {{.Name}}, 年龄: {{.Age}}, 邮箱: {{.Email}}`t2 := template.Must(template.New("person").Parse(tmpl2)) //person 是模板名字t2.Execute(os.Stdout, person)   //对应的结构体fmt.Println("\n")
}// 条件判断和循环演示
func conditionalAndLoopDemo() {fmt.Println("=== 条件判断和循环演示 ===")company := Company{Name:    "科技公司",Founded: 2020,Employees: []Person{{Name: "李四", Age: 25, Email: "lisi@example.com", IsAdmin: true},{Name: "王五", Age: 28, Email: "wangwu@example.com", IsAdmin: false},{Name: "赵六", Age: 32, Email: "zhaoliu@example.com", IsAdmin: false},},}// 使用 {{range .}} 循环和 {{if}} 条件判断// {{- 和 -}} 用于去除空白字符tmpl := `公司: {{.Name}} (成立于 {{.Founded}}年)员工列表:{{- range .Employees}}- 姓名: {{.Name}}{{- if .IsAdmin}} (管理员){{else}} (普通员工){{end}} 年龄: {{.Age}}, 邮箱: {{.Email}}{{- end}}`//通过IsAdmin 进行判断是否是管理员t := template.Must(template.New("company").Parse(tmpl))t.Execute(os.Stdout, company) //传入的 company 是一个大结构体,里面包括 Employees 列表fmt.Println()
}// HTML模板演示
func htmlTemplateDemo() {fmt.Println("=== HTML模板演示 ===")// HTML模板会自动转义特殊字符htmlTmpl := `
<!DOCTYPE html>
<html>
<head><title>{{.Name}} - 员工列表</title>
</head>
<body><h1>{{.Name}}</h1><p>成立年份: {{.Founded}}</p><h2>员工信息</h2><table border="1"><tr><th>姓名</th><th>年龄</th><th>邮箱</th><th>角色</th></tr>{{- range .Employees}}<tr><td>{{.Name}}</td><td>{{.Age}}</td><td>{{.Email}}</td><td>{{- if .IsAdmin -}}<span style="color: red;">管理员</span>{{- else -}}普通员工{{- end -}}</td></tr>{{- end}}</table>
</body>
</html>
`company := Company{Name:    "示例科技公司",Founded: 2020,Employees: []Person{{Name: "张三", Age: 30, IsAdmin: true},{Name: "李四", Age: 25, IsAdmin: false},},}// 创建HTML文件file, err := os.Create("company.html")  //创建接收的文件if err != nil {panic(err)}defer file.Close()t := template.Must(template.New("html").Parse(htmlTmpl))t.Execute(file, company)  //这里不是 os.stdout输出了,而是输出到了文件中fmt.Println("HTML文件已生成: company.html")
}// Must的使用演示
func mustTemplateDemo() {fmt.Println("=== Must使用演示 ===")// Must会在模板解析失败时直接panic// 这是一个正确的模板validTemplate := `Hello {{.Name}}!`t1 := template.Must(template.New("valid").Parse(validTemplate))person := Person{Name: "测试用户"}fmt.Print("正确模板输出: ")t1.Execute(os.Stdout, person)fmt.Println()// 演示错误处理(注释掉以避免程序崩溃)/*// 这是一个错误的模板语法,Must会直接panicinvalidTemplate := `Hello {{.Name!` // 缺少右括号t2 := template.Must(template.New("invalid").Parse(invalidTemplate))*/// 不使用Must的错误处理方式invalidTemplate := `Hello {{.Name!`  //这里缺少了右边括号    t2, err := template.New("invalid").Parse(invalidTemplate) //没有用 Must,用 Must 会 panic 导致程序退出if err != nil {fmt.Printf("模板解析错误: %v\n", err)} else {t2.Execute(os.Stdout, person)}
}

语法

1. 基本输出语法

  • {{.}}: 输出当前数据对象
  • {{.Name}}: 输出结构体的Name字段
  • {{.Field.SubField}}: 访问嵌套字段

2. 控制结构

  • {{if .IsAdmin}}...{{else}}...{{end}}: 条件判断
  • {{range .Employees}}...{{end}}: 循环遍历
  • {{with .Field}}...{{end}}: 设置上下文

3. 空白字符控制

  • {{-: 去除左侧空白字符
  • -}}: 去除右侧空白字符
  • {{- if .IsAdmin -}}: 去除两侧空白字符

4. Must函数

  • template.Must(): 在模板解析失败时直接panic
  • 适用于程序启动时的模板初始化
  • 类似于panic的检验机制
  • 如果需要接受错误就不要用 Must
http://www.xdnf.cn/news/8757.html

相关文章:

  • 使用中文作为map的可以,需要注意什么
  • linux学习第15天(递归遍历目录实现-ls -R)
  • 【C语言练习】062. 使用位运算优化算法
  • Lua基础语法
  • Linux 内核学习(9) --- Linux sysfs 文件系统
  • 【Redis】浅谈分布式系统
  • libevent2-介绍
  • 深入理解 JavaScript 面向对象编程与 Class
  • EPD_2IN7_V2_Clear() 和 Paint_Clear(WHITE) 的区别
  • 深度解析视频剪辑SDK开发:从AI字幕提取到多端原生插件集成-优雅草卓伊凡
  • 小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集上
  • Hertz+Kitex快速上手开发
  • 学习日志12 java
  • 低功耗蓝牙BLE之LE Controller Package CRC校验
  • MySQL 定时逻辑备份
  • uni-app学习笔记十二-vue3中组件传值(属性传值)
  • 解决DeepSeek部署难题:提升效率与稳定性的关键策略
  • 《JavaScript 性能优化:从原理到实战的全面指南》
  • vue3中自定义指令使用
  • Vue3 watch 使用与注意事项
  • 在Mathematica中,使用鸟枪法求解在无穷远处的边值常微分方程
  • 动态规划算法:字符串类问题(2)公共串
  • 简单血条于小怪攻击模板
  • 【Linux】深刻理解OS管理
  • Java 8 Stream操作示例
  • 《仿盒马》app开发技术分享-- 原生地图展示(端云一体)
  • 【Python】1. 基础语法(1)
  • webpack优化方法
  • 学习日记-day15-5.25
  • 云原生安全之HTTP协议:从基础到实战的安全指南