go語言模版 go語言模塊

golang 使用twig模板引擎,站在php的肩膀上!

和有些小伙伴一樣,本人是從php轉(zhuǎn)到了go,從事php時(shí)使用symfony框架一直享受其豐富的功能帶來的便利,轉(zhuǎn)到其他語言時(shí)比較直觀的感覺就是twig真強(qiáng),為什么其他語言沒有擴(kuò)展twig呢?

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括瀘水網(wǎng)站建設(shè)、瀘水網(wǎng)站制作、瀘水網(wǎng)頁制作以及瀘水網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,瀘水網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到瀘水省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

雖然前后端的開發(fā)模式,讓模板引擎這個(gè)東西慢慢淡去,但是有時(shí)候還是需要用到這種東西,所以就有了,go調(diào)用php實(shí)現(xiàn)twig模板引擎的想法。

原理,go 通過exec.Command調(diào)用php,通過STDIN,STDOUT 方式進(jìn)行數(shù)據(jù)交互

go在初始化階段提供一些配置參數(shù),比如模板引擎的為止,是否為開發(fā)環(huán)境等,php接收數(shù)據(jù)并初始化

初始換環(huán)境完畢后,當(dāng)需要渲染模板,go再講模板文件和數(shù)據(jù)以json字符串的形式寫入STDIN告知php,

php接收到數(shù)據(jù)后,解析數(shù)據(jù),選取指定的模板并渲染,然后通過STDOUT返回給go

這樣一次渲染就結(jié)束了

整理好的文件打包在github上了

如果喜歡就動(dòng)動(dòng)你的小手指點(diǎn)個(gè)贊,star一下吧!

golang模板引擎動(dòng)態(tài)讀取sql

可以。golang模板引擎動(dòng)態(tài)可以讀取sql。text/template是Go語言標(biāo)準(zhǔn)庫,實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)模板以生成文本輸出,可以理解為一組文字按照特定格式動(dòng)態(tài)嵌入另一組文字中。

golang的iris框架的模版如何相互引用?

1.用{{}}包圍的是變量,如 {{testName}} ,這表示把給定變量的值插入, {%%}這是塊元素 在faygo里叫tag,常見的有 for , if 等

2.如何在模板中定義變量, 平常我們在使用的模板的時(shí)候的常會(huì)有這樣的需要,在模板中要定義一個(gè)變量以方便前端邏輯的實(shí)現(xiàn),在faygo模板中定義變量需要用到標(biāo)簽{%set%}

使用方法

{#定義變量 newName #}

{% set newName = "hello faygo" %}

{#獲取變量newName的值#}

{{newName}}

定義用 tag set 取值就是上文所提到的{{}}取值

3.在模板中調(diào)用方法

這也是一個(gè)非常常見和有用的方法,在faygo中調(diào)用方法有兩種方式 , 一是在渲染模板時(shí)在faygo.Map在加入你要調(diào)用的方法 , 二是注冊一個(gè)全局的方法 (在faygo里叫filter過濾器),我們分別來看一下每個(gè)方法的實(shí)現(xiàn)

1) 在渲染模板時(shí)加入方法(render)

//在后端render時(shí)加入方法 testFunc

rErr := ctx.Render(200, switchDir+"index.html", faygo.Map{

"TITLE": title,

"testMap": map[string]string{"aaa": "111111"},

"testFunc": func(s string) string {

return s + " this is test func"

},

})

{#前端模板中調(diào)用#}

{{ testFunc("hello") }}

結(jié)果如下

hello this is test func

這種方法適合只用于此模板一個(gè)特殊方法 , 在其它功能中不通用 ,那么如果想定義一個(gè)方法全局都可以使用怎么辦,這里就需要注冊全局方法了(見下文)

2)注冊全局方法(過濾器)

如果想定義一個(gè)方法全局都可以使用怎么辦 ,這里就需要注冊一個(gè)方法

// pongo2 注冊一個(gè)全局過濾器,一般在程序啟動(dòng)時(shí)init中注冊

//這里注冊了一個(gè)名叫testFilter的過濾器,指向TestFilterFunc方法

pongo2.RegisterFilter("testFilter", TestFilterFunc)

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

a := in.String() + " this is global filter"

return pongo2.AsValue(a), nil

}

在這里我們看到TestFilterFunc方法里接收參數(shù)和返回參數(shù)的類型是pongo2.Value和pongo2.Error

在注冊過濾器里方法的接收參數(shù)和返回參數(shù)是固定的這兩個(gè)不能改變

官網(wǎng)的話:

All functions’ parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.

那么我們返回?cái)?shù)據(jù)時(shí)怎么返回? 在上面例子在我們看到了 AsValue 這個(gè)方法可以將我們數(shù)據(jù)返回,我們可以返回struct,map,array,string 等

在前端調(diào)用

{{ "hello" | testFilter }}

結(jié)果:

hello this is global filter

返回結(jié)構(gòu)體:

type LoginUserInfo struct {

Username string `json:"username"`

Telephone string `json:"telephone"`

Email string `json:"email"`

Level int `json:"level"`

}

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

userInfo := LoginUserInfo{

Username: "userA",

Telephone: "123456",

Email: "123456@test.com",

Level: 1,

}

return pongo2.AsValue(userInfo), nil

}

前端使用:

{#定義一個(gè)變量接收struct數(shù)據(jù) #}

{% set uinfo = "" | testFilter %}

{#取用戶名字#}

{{ uinfo.Username }}

注意,如是 uinfo 只是一個(gè)struct 不是struct數(shù)組([]uinfo)時(shí) 在模板中不能使用{% for %} 使用也不會(huì)得到任何數(shù)據(jù)

如果uinfo是struct數(shù)組 在模板中for循環(huán)時(shí)不要使用 key,val in uinfo

如果uinfo是struct數(shù)組 uinfo = []userInfo{}

{#錯(cuò)誤示例#}

{% for key,val in uinfo %}

{{val.Username}}

{% endfor %}

struct數(shù)據(jù)不能使用key,否則循環(huán)會(huì)執(zhí)行,但取不到任何數(shù)據(jù)

{# 正確示例 #}

{% for val in uinfo %}

{{val.Username}}

{% endfor %}

說一下返回map時(shí) 用for循環(huán)的情況,無論是否是map數(shù)組都可以用for key,val in uinfo 來遍歷數(shù)據(jù)

4. 在模板中字符串的連接和宏標(biāo)簽的使用

在模板中有時(shí)我們會(huì)碰到這樣的需要:在模板中有幾個(gè)變量 ,我們想把這幾個(gè)變量連接在一起賦值給另一個(gè)變量以做其它操作

例: 在模板中有三個(gè)變量 host是域名,route是路由地址,param是參數(shù) ,要把這三個(gè)變量連接起來賦值給另一個(gè)新的變量做urlencode操作。這應(yīng)該怎么辦

因?yàn)樵谀0逯惺褂?+ 號(hào)連接變量時(shí),程序會(huì)認(rèn)為是數(shù)學(xué)運(yùn)算,兩個(gè)字符串的連接值為0, 如果用內(nèi)置的filter: join來連接需要傳入一個(gè)slice,但這三個(gè)只是字符串變量。

這個(gè)時(shí)候我們可能就要用到宏標(biāo)簽了% macro %% endmacro %.

思路是這樣的,在宏標(biāo)簽中定義一個(gè)宏(可以理解為一個(gè)方法),這個(gè)宏接收三個(gè)參數(shù)(參數(shù)個(gè)數(shù)看需求而定),在宏內(nèi)返回連接的字符串

代碼:

{#定義三個(gè)變量#}

{% set host="" %}

{% set route="/aaa/bbb" %}

{% set param= "?id=123" %}

{#定義一個(gè)宏標(biāo)簽接收三個(gè)參數(shù),并返回。注意在宏標(biāo)簽內(nèi)如果換行,輸出的結(jié)果中也會(huì)有換行,在urlencode的時(shí)候也會(huì)把換行符進(jìn)行轉(zhuǎn)義#}

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}

hr

{#定義一個(gè)新變量調(diào)用宏方法,并將三個(gè)參數(shù)傳入#}

{% set newurl = joinUrl(host,route,param) %}

{#輸出newurl的值#}

{{newurl}}br

{#輸入出urlencode后的字符串#}

{{newurl|urlencode}}br

結(jié)果:

http%3A%2F%2F

在宏標(biāo)簽在也可加入自定義的一些字符串如在上面的宏標(biāo)簽返回結(jié)果中要加一個(gè)固定字符可以這樣寫:

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}

網(wǎng)站欄目:go語言模版 go語言模塊
本文URL:http://muchs.cn/article20/hgipco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈做網(wǎng)站、微信公眾號(hào)、響應(yīng)式網(wǎng)站、關(guān)鍵詞優(yōu)化網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)