最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go庫(kù)text與template包使用示例詳解

 更新時(shí)間:2022年12月15日 10:17:29   作者:小馬別過(guò)河  
這篇文章主要為大家介紹了Go庫(kù)text與template包使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

場(chǎng)景

現(xiàn)在的項(xiàng)目,基本都是前后端分離,后端只要提供Json等格式的數(shù)據(jù)就行。在這個(gè)背景下,模板渲染這個(gè)功能備受冷落,很少會(huì)在項(xiàng)目中用到。

雖然在 http 服務(wù)中,模板解析不常用,但日常開(kāi)發(fā)中,巧妙利用模板生成代碼,能使我們開(kāi)發(fā)事半功倍。比如:

  • 使用模板初始化項(xiàng)目。比如我們每次新建一個(gè) http 服務(wù),可能都需要 promethue 監(jiān)控、日志等模塊。每次都實(shí)現(xiàn)一遍不現(xiàn)實(shí),(或者 copy 別的項(xiàng)目),我們可以寫(xiě)好模板,支持自定義項(xiàng)目名,初始化新項(xiàng)目。
  • 生成代碼。比如之前文章提到的 mockery,就是解析 interface 的語(yǔ)法樹(shù),利用模板生成 Mock 對(duì)象。

text/template 包

基本用法

text/template提供的接口和html/template包一樣,只不過(guò)后者會(huì)為 html 格式的輸出做轉(zhuǎn)義,避免攻擊。

text/template 用法很簡(jiǎn)單:

func main() {
	// 要注入的變量
	type Inventory struct {
		Material string
		Count    uint
	}
	sweaters := Inventory{"wool", 17}
	// 模板內(nèi)容, {{.xxx}} 格式的都會(huì)被注入的變量替換
	text := `{{.Count}} items are made of {{.Material}}`
	TestTemplate(text, sweaters)
}
func TestTemplate(text string, data interface{}) {
	// 初始化,解析
	tmpl, err := template.New("test").Parse(text)
	if err != nil {
		panic(err)
	}
	// 輸出到 os.Stdout
	err = tmpl.Execute(os.Stdout, data)
	if err != nil {
		panic(err)
	}
}

結(jié)果輸出如下:

17 items are made of wool

其中,Execute的聲明為:

// 第一個(gè)參數(shù)是輸出的接口,第二個(gè)參數(shù)是要注入的數(shù)據(jù)
func (t *Template) Execute(wr io.Writer, data interface{}) error

第二個(gè)參數(shù) data 是 interface{},類(lèi)型不限,可以是:

  • 結(jié)構(gòu)體,屬性在模板中用 {{.Field}} 表示。
  • map,value 在模板中用 {{.Key}} 表示。
  • 其他簡(jiǎn)單類(lèi)型(int、string等),在模板中用{{.}}表示。
	// data 為 map
	m := map[string]interface{}{"Material": "wool", "Count": 17}
	TestTemplate(`{{.Count}} items are made of {{.Material}}`, m) // 輸出:17 items are made of wool
	// data 為 int,{{.}} 代表注入的變量
	TestTemplate(`{{.}} items`, 17) // 輸出:17 items

另外,我們也可以使用 template.Must 來(lái)檢測(cè)返回的 error, 如果 error 不為 nil 則 panic。也就是說(shuō)下面的代碼:

tmpl, err := template.New("test").Parse(text)
if err != nil {
  panic(err)
}

等價(jià)于:

tmpl := template.Must(template.New("test").Parse(txt))

我們重點(diǎn)介紹一下,Parse的參數(shù)(代碼中的text變量),也就是模板的內(nèi)容。

模板語(yǔ)法

模板里{{xxx}}格式稱(chēng)之為 Action,默認(rèn)以{{}}作為分界符,表示模板的流程控制、或者變量。

空白字符

如果 Action 以 {{- 開(kāi)頭,會(huì)把 action 左邊的空白字符刪除,這里的空白字符包括空格、換行、tab等。同理,-}}會(huì)把右邊的空白字符刪除。如:

	d := struct{ Name string }{"Neil"}
	TestTemplate(`name = {{.Name}} ;`, d) // 輸出:name = Neil ;
	// 刪除掉 .Name 左邊的空格
	TestTemplate(`name = {{- .Name}} ;`, d) // 輸出:name =Neil ;
	// 刪除掉 .Name 右邊的空格
	TestTemplate(`name = {{.Name -}} ;`, d) // 輸出:name = Neil;
	// 刪除掉 .Name 兩邊的空格
	TestTemplate(`name = {{- .Name -}} ;`, d) // 輸出:name =Neil;

常用 Action

備注,格式為 {{/*xxxx*/}},注意備注的內(nèi)容是可以換行的。

text := `{{/*this is a comment*/}} name : {{.}} `
TestTemplate(text, "Neil")
// 輸出:
//  name : Neil 

遍歷,可以使用 range 關(guān)鍵字。遍歷的變量只能是 slice、array、map 或者 channel。

下面代碼中的 {{.}} 代表 .MapContent 的元素。

d1 := struct{ MapContent []string }{MapContent: []string{"neil", "garmen", "ray"}}
text = "{{range .MapContent}}{{.}} {{end}}"
TestTemplate(text, d1)
// 輸出:
// neil garmen ray

注意,這時(shí)候的.不是代表d1變量,如果希望在 range 塊里面使用d1, 需要使用 {{$.}}。

另外也可以使用自定義變量來(lái)遍歷:

text = "{{range $i,$v := .MapContent}}{{$i}}=>{{$v}} {{end}}"
TestTemplate(text, d1)
// 輸出
// 0=>neil 1=>garmen 2=>ray

if-else,變量為零值,或者空 slice、array、map,就相當(dāng)于是 false。

text = `{{if .Name}}emtpy{{else}}not empty{{end}}`
d = struct{ Name string }{"Neil"}
TestTemplate(text, d) // 輸出: empty

if 還可以配合 and、or、not 使用:

// .condition1 && .condition2 
if and .condition1 .condition2 
// .condition1 ||  .condition2 
if or .condition1 .condition2 
// !.condition
if not .condition

with-else, 和if基本一樣。區(qū)別是,with 作用域的 {{.}} 代表 with 參數(shù),而不是全局的 {{.}}.

text = "{{with .Name}}{{.}}{{else}}empty{{end}}"
d = struct{ Name string }{"Neil"}
TestTemplate(text, d) // 輸出: Neil

自定義模板,使用 define 定義,template 引用。

text = `{{define "T1"}}ONE{{end}}
{{define "T2"}}TWO{{end}}
{{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}}
{{template "T3"}}`
TestTemplate(text, nil)
// 輸出: ONE TWO

函數(shù)

模板提供了一些函數(shù),如上文的and、ornot。比如下文的 index 函數(shù),打印 MapContent 的 index 為 1 的元素。

text = `{{index .MapContent 1}}`
d1 = struct{ MapContent []string }{MapContent: []string{"neil", "garmen", "ray"}}
TestTemplate(text, d1)
// 輸出:garmen

另外,函數(shù)還能以管道的方式,一個(gè)函數(shù)的結(jié)果,作為另一個(gè)參數(shù)的輸入,如 {{func1 args | func2 }}。還有可以使用自定義函數(shù),詳情可以查看官方文檔:pkg.go.dev/text/templa…。

總結(jié)

text/template 功能挺多,本文只是大致介紹一下,詳情還得移步官網(wǎng)

以上就是Go庫(kù)text與template包使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go庫(kù)text template包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang對(duì)自定義類(lèi)型進(jìn)行排序的解決方法

    golang對(duì)自定義類(lèi)型進(jìn)行排序的解決方法

    學(xué)習(xí)一門(mén)編程語(yǔ)言,要掌握原子數(shù)據(jù)類(lèi)型,還需要掌握自定義數(shù)據(jù)類(lèi)型。下面這篇文章主要給大家介紹了關(guān)于golang如何對(duì)自定義類(lèi)型進(jìn)行排序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    這篇文章主要為大家介紹了Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息的實(shí)例搬磚,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 大多數(shù)Go程序員都走過(guò)的坑盤(pán)點(diǎn)解析

    大多數(shù)Go程序員都走過(guò)的坑盤(pán)點(diǎn)解析

    這篇文章主要為大家介紹了大多數(shù)Go程序員都走過(guò)的坑盤(pán)點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • GO語(yǔ)言導(dǎo)入自己寫(xiě)的包(同級(jí)目錄和不同目錄)

    GO語(yǔ)言導(dǎo)入自己寫(xiě)的包(同級(jí)目錄和不同目錄)

    本文介紹了如何在Go語(yǔ)言項(xiàng)目中導(dǎo)入同級(jí)目錄和不同目錄的包,詳細(xì)解釋了創(chuàng)建文件結(jié)構(gòu)、編寫(xiě)主函數(shù)、同級(jí)目錄和不同目錄方法的調(diào)用,適合初學(xué)者參考,幫助理解Go項(xiàng)目的基本構(gòu)建和包管理
    2024-09-09
  • Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)聊天小工具(UDP版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang 格式化輸入輸出操作

    golang 格式化輸入輸出操作

    這篇文章主要介紹了golang 格式化輸入輸出操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go將request?body綁定到不同的結(jié)構(gòu)體中教程

    go將request?body綁定到不同的結(jié)構(gòu)體中教程

    這篇文章主要為大家介紹了go將request?body綁定到不同的結(jié)構(gòu)體中教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 淺析go逆向符號(hào)恢復(fù)

    淺析go逆向符號(hào)恢復(fù)

    這篇文章主要介紹了go逆向符號(hào)恢復(fù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • GoLang context包的使用方法介紹

    GoLang context包的使用方法介紹

    日常Go開(kāi)發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會(huì)有探索的欲望,那么就跟著本篇文章,一起來(lái)學(xué)習(xí)吧
    2023-03-03
  • 手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù)

    手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù)

    本文主要介紹了手把手教你導(dǎo)入Go語(yǔ)言第三方庫(kù),通過(guò)導(dǎo)入gin包來(lái)深入學(xué)習(xí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

逊克县| 大厂| 大关县| 鹤壁市| 崇仁县| 古交市| 徐水县| 塘沽区| 宜都市| 汉中市| 长泰县| 略阳县| 合水县| 彩票| 五河县| 措美县| 广河县| 五台县| 汝南县| 麦盖提县| 鄂州市| 萍乡市| 天气| 深州市| 晋城| 上杭县| 屯昌县| 新宁县| 清远市| 聊城市| 涟水县| 黔江区| 五华县| 五河县| 宁夏| 凤凰县| 麻栗坡县| 谷城县| 吐鲁番市| 南汇区| 平顺县|