成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),雙清網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:雙清等地區(qū)。雙清做網(wǎng)站價(jià)格咨詢:18982081108
本文主題:基于內(nèi)置的text/template實(shí)現(xiàn)Golang模版渲染,并將結(jié)果寫入文件、屏幕、變量。
小慢哥的原創(chuàng)文章,歡迎轉(zhuǎn)載
? 定義結(jié)構(gòu)體
? 定義模版文本
? 模版渲染及輸出方式
? 完整例子
首先,定義一個(gè)結(jié)構(gòu)體,用于后面的模版渲染
type Person struct {
Name string
Age int
Boy bool
}
注意:struct的元素必須要可導(dǎo)出(大寫打頭),否則渲染時(shí)候找不到
實(shí)例化結(jié)構(gòu)體,用于模版渲染時(shí)候獲得對(duì)應(yīng)值
foo := Person{
Name: "foo",
Age: 18,
Boy: false,
}
接下來,定義一個(gè)模版文本,此處直接定義了一個(gè)常量,表示模版文本
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)
}
在渲染時(shí)候需要傳遞一個(gè)參數(shù),用于指定輸出到何處,常見的有3種目的地:
? 輸出到文件
? 輸出到變量
? 輸出到屏幕
輸出到文件:需要先open一個(gè)文件并獲得文件句柄
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() {
// 實(shí)例化結(jié)構(gòu)體
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}}.
`
// 根據(jù)指定模版文本生成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())
// 模版渲染,并輸出到屏幕標(biāo)準(zhǔn)輸出
if err := tmpl.Execute(os.Stdout, foo); err != nil {
log.Fatalln(err)
}
}
測(cè)試效果
# 編譯
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)內(nèi)容
My name is foo,
I'm 18 years old,
I'm a girl.