最近在整理我們專案**的時候,發現有很多活動的**在結構和提供的功能上都非常相似。為了方便今後的開發,我花了一點時間編寫了乙個生成**框架的工具,最大程度地降低重複勞動。**本身並不複雜,且與專案**關聯性較大,這裡就不展開介紹了。在這個過程中,我發現 go 標準的模板庫text/template
和html/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 **沒太大的區別,幾乎沒有學習成本。只是在模板中使用這些語法時,需要使用包裹起來,而且
if
和for
等需要新增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 ...