十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
成都创新互联公司是一家专注于成都网站设计、成都网站制作、外贸网站建设与策划设计,双清网站建设哪家好?成都创新互联公司做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:双清等地区。双清做网站价格咨询:18982081108
本文主题:基于内置的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.