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