本文主題:基於內置的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.