引言
您是否需要以格式良好的輸出、文本報告或HTML頁面呈現一些數據?你可以使用Go模板來做到這一點。任何Go程序都可以使用text/template
或html/template
包(兩者都包含在Go標準庫中)來整齊地顯示數據。
這兩個包都允許你編寫文本模板并將數據傳遞給它們,以按你喜歡的格式呈現文檔。在模板中,可以遍歷數據并使用條件邏輯來決定在文檔中包含哪些項以及它們應該如何顯示。本教程將向您展示如何使用這兩個模板包。首先,你將使用text/template
將一些數據渲染為使用循環、條件邏輯和自定義函數的純文本報告。然后你將使用html/template
將相同的數據渲染到一個沒有代碼注入的html文檔中。
前期準備
步驟1 -導入text/template
假設你想要生成一份關于狗的數據的簡單報告。你希望像這樣顯示它:
---
Name: JujubeSex: Female (spayed)Age: 10 monthsBreed: German Shepherd/Pitbull---
Name: ZephyrSex: Male (intact)Age: 13 years, 3 monthsBreed: German Shepherd/Border Collie
這是你將使用text/template
包生成的報告。突出顯示的項目是您的數據,其余是來自模板的靜態文本。模板要么以字符串的形式存在于代碼中,要么與代碼放在一起的文件中。它們包含與條件語句(即if/else)、流控制語句(即循環)和函數調用交織在一起的樣板靜態文本,所有這些都包裝在{{. . .}}
標記中。您將向模板傳遞一些數據以渲染像上面那樣的最終文檔。
首先,導航到你的Go工作空間(go env GOPATH
)并為這個項目創建一個新目錄:
cd `go env GOPATH`
mkdir pets
cd pets
使用nano
或者你最喜歡的文本編輯器,打開一個名為pets.go
的新文件并粘貼以下內容:
nano pets.go
pets.go
package mainimport ("os""text/template"
)func main() {
}
這個文件聲明自己在main
包中,并包含一個main
函數,這意味著它可以使用go run
運行。它導入了text/template
標準庫包,以允許你編寫和渲染模板,以及os
,用于打印到終端。
步驟2 -創建模板數據
在編寫模板之前,讓我們創建一些數據來傳遞給模板。在import
語句下面,main()
語句之前,定義一個名為Pet
的結構體,其中包含寵物的Name
、Sex
、寵物是否閹割(complete
)、Age
和Breed
字段。編輯pets.go
并添加以下結構體:
pets.go
. . .
type Pet struct {Name stringSex stringIntact boolAge stringBreed string
}
. . .
現在,在main()
函數的主體中,創建一個Pet
的切片來保存關于兩只狗的數據:
pets.go
. . .
func main() {dogs := []Pet{{Name: "Jujube",Sex: "Female",Intact: false,Age: "10 months",Breed: "German Shepherd/Pitbull",},{Name: "Zephyr",Sex: "Male",Intact: true,Age: "13 years, 3 months",Breed: "German Shepherd/Border Collie",},}
} // end main
這些數據將被傳遞到您的模板以渲染最終報告。當然,傳遞給模板的數據可以來自任何地方:數據庫、第三方API等。對于本教程,最簡單的方法是將一些示例數據粘貼到代碼中。
現在讓我們看看如何渲染(用這些包的術語來說就是執行)一個模板。
步驟3 -執行模板
在這一步中,你將看到如何使用text/template
從模板生成一個完成的文檔,但直到第4步,你才會真正編寫一個有用的模板。
創建一個名為pets.tmpl
的空文本文件,其中包含一些靜態文本:
pets.tmpl
Nothing here yet.
保存模板并退出編輯器。如果你使用的是nano
,按下CTRL+X
,然后Y
和ENTER
來確認你的更改。
雖然執行這個模板只會打印“Nothing here yet”。,讓我們傳入數據并執行模板,只是為了證明text/template
是有效的。在你的main()
函數中,在dogs
切片的后面添加以下代碼:
pets.go
. . .var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)if err != nil {panic(err)}
} // end main
在這段代碼中,你使用Template.New
來創建一個新的Template
,然后在生成的模板上調用ParseFiles
來解析你的最小模板文件。檢查錯誤后,調用新模板的Execute
方法,傳入os.Stdout
將完成的報告打印到終端,同時傳入dogs
切片。對于第一個參數,您可以傳入任何實現’ io.Writer '接口的東西,例如,您可以將報告寫入文件。稍后我們將看到如何做到這一點。
完整的程序看起來應該像這樣:
package mainimport ("os""text/template"
)type Pet struct {Name stringSex stringIntact boolAge stringBreed string
}func main() {dogs := []Pet{{Name: "Jujube",Sex: "Female",Intact: false,Age: "10 months",Breed: "German Shepherd/Pitbull",},{Name: "Zephyr",Sex: "Male",Intact: true,Age: "13 years, 3 months",Breed: "German Shepherd/Border Collie",},}var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)<