Go語言寫 PC Web 程序應該要掌握的模塊 http/template

2019-09-29   Go語言中文網

html/template包實現了數據驅動的模板,用於生成可對抗代碼注入的安全HTML輸出。它提供了和text/template包相同的接口,Go語言中輸出HTML的場景都應使用text/template包。

模板

在基於MVC的Web架構中,我們通常需要在後端渲染一些數據到HTML文件中,從而實現動態的網頁效果。

模板示例

通過將模板應用於一個數據結構(即該數據結構作為模板的參數)來執行,來獲得輸出。模板中的注釋引用數據接口的元素(一般如結構體的欄位或者字典的鍵)來控制執行過程和獲取需要呈現的值。模板執行時會遍歷結構並將指針表示為』.『(稱之為」dot」)指向運行過程中數據結構的當前位置的值。

用作模板的輸入文本必須是utf-8編碼的文本。」Action」—數據運算和控制單位—由」{{「和」}}「界定;在Action之外的所有文本都不做修改的拷貝到輸出中。Action內部不能有換行,但注釋可以有換行。

HTML文件代碼如下:

我們的HTTP server端代碼如下:

模板語法

{{.}}

模板語法都包含在{{和}}中間,其中{{.}}中的點表示當前對象。

當我們傳入一個結構體對象時,我們可以根據.來訪問結構體的對應欄位。例如:

HTML文件代碼如下:

同理,當我們傳入的變量是map時,也可以在模板文件中通過.根據key來取值。

注釋

pipeline

pipeline是指產生數據的操作。比如{{.}}、{{.Name}}等。Go的模板語法中支持使用管道符號|連結多個命令,用法和unix下的管道類似:|前面的命令會將運算結果(或返回值)傳遞給後一個命令的最後一個位置。

注意:並不是只有使用了|才是pipeline。Go的模板語法中,pipeline的概念是傳遞數據,只要能產生數據的,都是pipeline。

變量

Action里可以初始化一個變量來捕獲管道的執行結果。初始化語法如下:

其中$variable是變量的名字。聲明變量的action不會產生任何輸出。

條件判斷

Go模板語法中的條件判斷有以下幾種:

range

Go的模板語法中使用range關鍵字進行遍歷,有以下兩種寫法,其中pipeline的值必須是數組、切片、字典或者通道。

with

預定義函數

執行模板時,函數從兩個函數字典中查找:首先是模板函數字典,然後是全局函數字典。一般不在模板內定義函數,而是使用Funcs方法添加函數到模板里。

預定義的全局函數如下:

比較函數

布爾函數會將任何類型的零值視為假,其餘視為真。

下面是定義為函數的二元比較運算的集合:

為了簡化多參數相等檢測,eq(只有eq)可以接受2個或更多個參數,它會將第一個參數和其餘參數依次比較,返回下式的結果:

{{eq arg1 arg2 arg3}}

比較函數隻適用於基本類型(或重定義的基本類型,如」type Celsius float32」)。但是,整數和浮點數不能互相比較。

自定義函數

Go的模板支持自定義函數。

我們可以在模板文件hello.html中使用我們自定義的kua函數了。

{{kua .Name}}

嵌套template

我們可以在template中嵌套其他的template。這個template可以是單獨的文件,也可以是通過define定義的template。

舉個例子: t.html文件內容如下:

ul.html文件內容如下:

我們註冊一個templDemo路由處理函數.

tmplDemo函數的具體內容如下: