本文主题:基于内置的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.Bufferif 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 mainimport ( "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.