您好,登錄后才能下訂單哦!
本文主題:基于內置的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.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。