Go 每日一庫之 quicktemplate

2021-10-09 19:45:26 字數 3941 閱讀 1968

最近在整理我們專案**的時候,發現有很多活動的**在結構和提供的功能上都非常相似。為了方便今後的開發,我花了一點時間編寫了乙個生成**框架的工具,最大程度地降低重複勞動。**本身並不複雜,且與專案**關聯性較大,這裡就不展開介紹了。在這個過程中,我發現 go 標準的模板庫text/templatehtml/template使用起來比較束手束腳,很不方便。我從 github 了解到quicktemplate這個第三方模板庫,功能強大,語法簡單,使用方便。今天我們就來介紹一下quicktemplate

本文**使用 go modules。

先建立**目錄並初始化:

quicktemplate會將我們編寫的模板**轉換為 go 語言**。因此我們需要安裝quicktemplate包和乙個名為qtc的編譯器:

首先,我們需要編寫quicktemplate格式的模板檔案,模板檔案預設以.qtpl作為副檔名。下面我編寫了乙個簡單的模板檔案greeting.qtpl

all text outside function is treated as comments.

hello,

模板語法非常簡單,我們只需要簡單了解以下 2 點:

greeting.qtpl儲存到templates目錄,然後執行qtc命令。該命令會生成對應的 go 檔案greeting.qtpl.go,包名為templates。現在,我們就可以使用這個模板了:

呼叫模板函式,傳入引數,返回渲染後的文字:

$ go run .

hello, dj

hello, dj

hello, dj

hello, dj

hello, dj

執行文字替換,迴圈生成重複文字。輸出**現多個空格和換行,這是因為函式內除了語法結構,其他內容都會原樣保留,包括空格和換行

需要注意的是,由於quicktemplate是將模板轉換為 go **使用的,所以如果模板有修改,必須先執行qtc命令重新生成 go **,否則修改不生效

quicktemplate支援 go 常見的語法結構,if/for/func/import/return。而且寫法與直接寫 go **沒太大的區別,幾乎沒有學習成本。只是在模板中使用這些語法時,需要使用包裹起來,而且iffor等需要新增endif/endfor明確表示結束。

上面我們已經看到如何渲染傳入的引數name,使用。由於name是 string 型別,所以在

int: , float64: , bytes: , string with quotes: , string without quotes: .

然後使用:

func main() , "hello"))

}

執行:

$ go run .

int: 1, float64: 5.75, bytes: abc, string with quotes: "hello", string without quotes: hello.

quicktemplate支援在模板中呼叫模板函式、標準庫的函式。由於qtc會直接生成 go **,我們甚至還可以在同目錄下編寫自己的函式給模板呼叫,模板 a 中也可以呼叫模板 b 中定義的函式。

我們先在templates目錄下編寫乙個檔案rank.go,定義乙個rank函式,傳入分數,返回評級:

package templates

func rank(score int) string  else if score >= 80  else if score >= 70  else if score >= 60  else 

}

然後我們可以在模板中呼叫這個函式:

編譯模板:

$ qtc
編寫程式:

func main()
執行程式輸出:

$ go run .

dj: score-85 rank-b

lizi: score-96 rank-a

hjw: score-52 rank-e

由於我們在模板中用到fmt包,需要先使用將該包匯入。

在模板中呼叫另乙個模板的函式也是類似的,因為模板最終都會轉為 go **。go **中有同樣簽名的函式。

quicktemplate常用來編寫 html 頁面的模板:

hi, 

welcome to the awesome web!!!

下面編寫乙個簡單的 web 伺服器:

}qtc會生成乙個write*的方法,它接受乙個io.writer的引數。將模板渲染的結果寫入這個io.writer中,我們可以直接將http.responsewriter作為引數傳入,非常便捷。

執行:

$ qtc

$ go run .

瀏覽器輸入localhost:8080?name=dj檢視結果。

quicktemplate至少有下面 3 個優勢:

從我個人的實際使用情況來看,確實很方便,很實用。感興趣的還可以去看看qtc生成的 go **。

quicktemplate github:

go 每日一庫 github:

我的部落格:

Go 每日一庫之 go homedir

公尺妮 m.amini.net 今天我們來看乙個很小,很實用的庫go homedir。顧名思義,go homedir用來獲取使用者的主目錄。實際上,使用標準庫os user我們也可以得到這個資訊 package main import fmt log os user func main fmt.pr...

Go每日一題 6

以下 是否編譯通過 package main import fmt type myint1 inttype myint2 int func main 輸出結果 編譯不通過,cannot use i type int as type myint1 in assignment。myint1 和 myin...

go每日一庫 home dir 獲取使用者主目錄

我的部落格 文章首發 顧名思義,go homedir用來獲取使用者的主目錄。實際上,通過使用標準庫os user我們也可以得到內容,使用以下方式 package main import fmt log os user func main fmt.println home dir u.homedir ...