Go web入門Go pongo2模板引擎
Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板。
模板引擎是一個(gè)庫(kù),旨在將模板與數(shù)據(jù)結(jié)合起來(lái)以生成文檔。模板引擎用于生成大量電子郵件、源代碼預(yù)處理或生成動(dòng)態(tài) HTML 頁(yè)面。
模板由靜態(tài)數(shù)據(jù)和動(dòng)態(tài)區(qū)域組成。動(dòng)態(tài)區(qū)域稍后被數(shù)據(jù)替換。渲染函數(shù)稍后將模板與數(shù)據(jù)結(jié)合起來(lái)。模板引擎用于將模板與數(shù)據(jù)模型相結(jié)合以生成文檔。
pongo2 庫(kù)是一個(gè)受 Django 模板引擎啟發(fā)的 Go 模板引擎。
下載 pongo2 函數(shù)庫(kù)
使用如下命令:
go get -u github.com/flosch/pongo2/v4
安裝成功后可以看到如下輸出:
go: downloading github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 go: downloading github.com/flosch/pongo2/v4 v4.0.2 go: downloading gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b go: downloading github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e go: downloading github.com/kr/text v0.1.0 go: added github.com/flosch/pongo2/v4 v4.0.2
pongo2 在模板字符串中使用了各種分隔符:
{% %} - statements
{{ }} - expressions to print to the template output
{# #} - comments which are not included in the template output
# ## - line statements
模板可以從帶有 pongo2.FromString 的字符串、帶有 pongo2.FromFile 的文件或帶有pongo2.FromBytes 的字節(jié)中讀取。
文檔使用 Execute、ExecuteWriter 或 ExecuteBytes 函數(shù)呈現(xiàn)。這些函數(shù)接受一個(gè)上下文,它為模板提供常量、變量、實(shí)例或函數(shù)。
從字符串中讀取模板
pongo2.FromString 函數(shù)從字符串中讀取模板。如下代碼將生成一條簡(jiǎn)單的文本消息:
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) func main() { tpl, err := pongo2.FromString("Hello {{ name }}~") if err != nil { log.Fatal(err) } res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"}) if err != nil { log.Fatal(err) } fmt.Println(res) }
要打印的變量放在 {{ }} 括號(hào)內(nèi)。
tpl, err := pongo2.FromString("Hello {{ name }}!")
接著,我們使用 Execute 渲染最終的字符串。在上下文中,我們?yōu)?name 變量傳遞一個(gè)值 “宇宙之一粟”:
res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"})
最后,運(yùn)行該代碼:
$ go run main.go Hello 宇宙之一粟~
如下圖:
再來(lái)看一個(gè)例子,我們可以傳遞兩個(gè)文本:
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) func main() { tpl, err := pongo2.FromString("{{ name }}是{{ occupation }}") if err != nil { log.Fatal(err) } name, occupation := "宇宙之一粟", "程序猿??????" ctx := pongo2.Context{"name": name, "occupation": occupation} res, err := tpl.Execute(ctx) if err != nil { log.Fatal(err) } fmt.Println(res) }
運(yùn)行該代碼:
$ go run main.go 宇宙之一粟是程序猿??????
從文件中讀取文本
使用 ??pongo2.FromFile?? 函數(shù),我們從文件中讀取模板。
新建一個(gè) test.tpl 模板文件:
{{ name }}是{{ occupation }}
該示例生成一條簡(jiǎn)單的消息,同時(shí)從文件中讀取模板。寫好 main.go 文件:
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) func main() { tpl, err := pongo2.FromFile("test.tpl") if err != nil { log.Fatal(err) } name, occupation := "宇宙之一粟", "不掉發(fā)的程序猿" ctx := pongo2.Context{"name": name, "occupation": occupation} res, err := tpl.Execute(ctx) if err != nil { log.Fatal(err) } fmt.Println(res) }
運(yùn)行該程序:
$ go run main.go 宇宙之一粟是不掉發(fā)的程序猿
Go pongo2 迭代
for 語(yǔ)句用于迭代模板中的數(shù)據(jù)集合。
新建一個(gè) words.tpl 文件:
{% for word in words -%} {{ word }} {% endfor %}
在模板中,我們使用 for 指令來(lái)遍歷 words 數(shù)據(jù)結(jié)構(gòu)的元素??梢杂?- 字符去除空白字符。
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) func main() { tpl, err := pongo2.FromFile("words.tpl") if err != nil { log.Fatal(err) } words := []string{"只要", "對(duì)", "編碼", "保持", "熱愛", "!"} ctx := pongo2.Context{"words": words} res, err := tpl.Execute(ctx) if err != nil { log.Fatal(err) } fmt.Println(res) }
在程序中,我們將一段單詞傳遞給 tempate 引擎。我們得到一個(gè)單詞列表作為輸出。
$ go run main.go 只要 對(duì) 編碼 保持 熱愛 !
Go pongo2 過濾
可以將過濾器應(yīng)用于數(shù)據(jù)以修改它們。在 | 之后應(yīng)用過濾器特點(diǎn)。
更改 words.tpl 文件
{% for word in words -%} {{ word }} has {{ word | length }} characters {% endfor %}
main 文件:
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) func main() { tpl, err := pongo2.FromFile("words.tpl") if err != nil { log.Fatal(err) } words := []string{"只要", "對(duì)", "編碼", "保持", "熱愛", "!"} ctx := pongo2.Context{"words": words} res, err := tpl.Execute(ctx) if err != nil { log.Fatal(err) } fmt.Println(res) }
在程序中,我們將一段單詞傳遞給模板。我們打印每個(gè)單詞及其大小。運(yùn)行該程序:
只要 has 2 characters 對(duì) has 1 characters 編碼 has 2 characters 保持 has 2 characters 熱愛 has 2 characters ! has 1 characters
Go pongo2 條件
可以使用 if/endif 指令創(chuàng)建條件。
新建一個(gè) todo.tpl 文件:
{% for todo in todos -%} {% if todo.Done %} {{- todo.Title -}} {% endif %} {% endfor %}
在模板文件中,我們使用 if 指令僅輸出已完成的任務(wù)。
我們從一片待辦事項(xiàng)中生成輸出。在輸出中,我們僅包含已完成的任務(wù)。
package main import ( "fmt" "github.com/flosch/pongo2/v4" "log" ) type Todo struct { Title string Done bool } type Data struct { Todos []Todo } func main() { tpl, err := pongo2.FromFile("todo.tpl") if err != nil { log.Fatal(err) } todos := []Todo{ {Title: "看書一小時(shí)", Done: false}, {Title: "寫代碼五小時(shí)", Done: true}, {Title: "吃飯三餐", Done: true}, {Title: "不加班", Done: false}, {Title: "日更寫文章", Done: true}, } ctx := pongo2.Context{"todos": todos} res, err := tpl.Execute(ctx) if err != nil { log.Fatal(err) } fmt.Println(res) }
運(yùn)行代碼:
$ go run main.go 寫代碼五小時(shí) 吃飯三餐 日更寫文章
總結(jié)
這篇文章介紹了第三方模板庫(kù) pongo2,pongo2 是一種類似于 Django 語(yǔ)法的 Go 的模板語(yǔ)言。并介紹了從字符串和文件中兩種方式獲取文本,并介紹了 pongo2 的迭代、過濾和 if 條件的使用,并給出了每個(gè)代碼案例,希望能對(duì)你有幫助。關(guān)于 pongo2 的更多用法請(qǐng)參考官方鏈接,還有更多基于 pongo2 的第三方擴(kuò)展庫(kù),都值得一看,哪個(gè)方便用哪個(gè)。
參考鏈接:
https://zetcode.com/golang/pongo2/
https://github.com/flosch/pongo2
以上就是Go語(yǔ)言編程入門Go pongo2模板引擎的詳細(xì)內(nèi)容,更多關(guān)于Go pongo2模板引擎的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang基于websocket通信tcp keepalive研究記錄
這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn)
這篇文章主要介紹了Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07go語(yǔ)言單例模式(Singleton)實(shí)例分析
這篇文章主要介紹了go語(yǔ)言單例模式(Singleton),實(shí)例分析了單例模式的原理與Go語(yǔ)言的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03go語(yǔ)言beego框架web開發(fā)語(yǔ)法筆記示例
這篇文章主要為大家介紹了go語(yǔ)言beego框架web開發(fā)語(yǔ)法筆記示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04關(guān)于go-zero服務(wù)自動(dòng)收集問題分析
這篇文章主要介紹了關(guān)于go-zero服務(wù)自動(dòng)收集問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Golang使用協(xié)程實(shí)現(xiàn)批量獲取數(shù)據(jù)
服務(wù)端經(jīng)常需要返回一個(gè)列表,里面包含很多用戶數(shù)據(jù),常規(guī)做法當(dāng)然是遍歷然后讀緩存。使用Go語(yǔ)言后,可以并發(fā)獲取,極大提升效率,本文就來(lái)聊聊具體的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-02-02