GO学习笔记 - 模版渲染及多种输出
程序员文章站
2022-05-04 12:30:13
本文主题:基于内置的text/template实现Golang模版渲染,并将结果写入文件、屏幕、变量。 ......
本文主题:基于内置的text/template实现golang模版渲染,并将结果写入文件、屏幕、变量。
小慢哥的原创文章,欢迎转载
目录
▪ 定义结构体
▪ 定义模版文本
▪ 模版渲染及输出方式
▪ 完整例子
定义结构体
首先,定义一个结构体,用于后面的模版渲染
type person struct { name string age int boy bool }
注意:struct的元素必须要可导出(大写打头),否则渲染时候找不到
实例化结构体,用于模版渲染时候获得对应值
foo := person{ name: "foo", age: 18, boy: false, }
定义模版文本
接下来,定义一个模版文本,此处直接定义了一个常量,表示模版文本
const text = `my name is {{.name}}, i'm {{.age}} years old, i'm a {{if .boy}}boy{{else}}girl{{end}}. `
读取文本,获取template的handler
tmpl, err := template.new("").parse(text) if err != nil { log.fatalln(err) }
模版渲染及输出方式
在渲染时候需要传递一个参数,用于指定输出到何处,常见的有3种目的地:
▷ 输出到文件
▷ 输出到变量
▷ 输出到屏幕
输出到文件:需要先open一个文件并获得文件句柄
f, err := os.openfile("/tmp/test", os.o_wronly|os.o_create, 0644) defer f.close() if err != nil { log.fatalln(err) } // 渲染并写入文件 if err := tmpl.execute(f, foo); err != nil { log.fatalln(err) }
输出到变量
var buf bytes.buffer if err := tmpl.execute(&buf, foo); err != nil { log.fatalln(err) } fmt.println(buf.string())
输出到屏幕
if err := tmpl.execute(os.stdout, foo); err != nil { log.fatalln(err) }
完整例子
package main import ( "log" "os" "text/template" ) type person struct { name string age int boy bool } func main() { // 实例化结构体 foo := person{ name: "foo", age: 18, boy: false, } // 定义模版文本 const text = `my name is {{.name}}, i'm {{.age}} years old, i'm a {{if .boy}}boy{{else}}girl{{end}}. ` // 根据指定模版文本生成handler tmpl, err := template.new("").parse(text) if err != nil { log.fatalln(err) } // 模版渲染,并写入文件 f, err := os.openfile("/tmp/test", os.o_wronly|os.o_create, 0644) defer f.close() if err != nil { log.fatalln(err) } if err := tmpl.execute(f, foo); err != nil { log.fatalln(err) } // 模版渲染,并赋值给变量 var buf bytes.buffer if err := tmpl.execute(&buf, foo); err != nil { log.fatalln(err) } fmt.println(buf.string()) // 模版渲染,并输出到屏幕标准输出 if err := tmpl.execute(os.stdout, foo); err != nil { log.fatalln(err) } }
测试效果
# 编译 go build template.go ./template # 输出 my name is foo, i'm 18 years old, i'm a girl. my name is foo, i'm 18 years old, i'm a girl. # 查看文件(/tmp/test)内容 my name is foo, i'm 18 years old, i'm a girl.
上一篇: maven聚合与继承