go語(yǔ)言iris框架設(shè)置 go iris

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

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

細(xì)河網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,細(xì)河網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為細(xì)河上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的細(xì)河做網(wǎng)站的公司定做!

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

使用方法

{#定義變量 newName #}

{% set newName = "hello faygo" %}

{#獲取變量newName的值#}

{{newName}}

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

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

這也是一個(gè)非常常見(jiàn)和有用的方法,在faygo中調(diào)用方法有兩種方式 , 一是在渲染模板時(shí)在faygo.Map在加入你要調(diào)用的方法 , 二是注冊(cè)一個(gè)全局的方法 (在faygo里叫filter過(guò)濾器),我們分別來(lái)看一下每個(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è)方法全局都可以使用怎么辦,這里就需要注冊(cè)全局方法了(見(jiàn)下文)

2)注冊(cè)全局方法(過(guò)濾器)

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

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

//這里注冊(cè)了一個(gè)名叫testFilter的過(guò)濾器,指向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

在注冊(cè)過(guò)濾器里方法的接收參數(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 %}

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

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

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

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

因?yàn)樵谀0逯惺褂?+ 號(hào)連接變量時(shí),程序會(huì)認(rèn)為是數(shù)學(xué)運(yùn)算,兩個(gè)字符串的連接值為0, 如果用內(nèi)置的filter: join來(lái)連接需要傳入一個(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è)固定字符可以這樣寫(xiě):

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

iris 真的是最快的Golang 路由框架嗎

這里有個(gè)評(píng)測(cè):

最快的還是fasthttp,iris也是基于fasthttp的,不會(huì)比f(wàn)asthttp快

golang 有哪些比較穩(wěn)定的 web 開(kāi)發(fā)框架

第一個(gè):Beego框架

Beego框架是astaxie的GOWeb開(kāi)發(fā)的開(kāi)源框架。Beego框架最大的特點(diǎn)是由八個(gè)大的基礎(chǔ)模塊組成,八大基礎(chǔ)模塊的特點(diǎn)是可以根據(jù)自己的需要進(jìn)行引入,模塊相互獨(dú)立,模塊之間耦合性低。

相應(yīng)的Beego的缺點(diǎn)就是全部使用時(shí)比較臃腫,通過(guò)bee工具來(lái)構(gòu)建項(xiàng)目時(shí),直接生成項(xiàng)目目錄和耦合關(guān)系,從而會(huì)導(dǎo)致在項(xiàng)目開(kāi)發(fā)過(guò)程中受制性較大。

第二個(gè):Gin框架

Gin是一個(gè)GOlang的微框架,封裝比較優(yōu)雅,API友好,源碼注釋比較明確,已經(jīng)發(fā)布了1.0版本;具有快速靈活、容錯(cuò)方便等特點(diǎn),其實(shí)對(duì)于golang而言,web框架的依賴遠(yuǎn)比Python、Java更小。

目前在很多使用golang的中小型公司中進(jìn)行業(yè)務(wù)開(kāi)發(fā),使用Gin框架的很多,大家如果想使用golang進(jìn)行熟練Web開(kāi)發(fā),可以多關(guān)注一下這個(gè)框架。

第三個(gè):Iris框架

Iris框架在其官方網(wǎng)站上被描述為GO開(kāi)發(fā)中最快的Web框架,并給出了多框架和多語(yǔ)言之前的性能對(duì)比。目前在github上,Iris框架已經(jīng)收獲了14433個(gè)star和1493個(gè)fork,可見(jiàn)是非常受歡迎的。

在實(shí)際開(kāi)發(fā)中,Iris框架與Gin框架的學(xué)習(xí)曲線幾乎相同,所以掌握了Gin就可以輕松掌握Iris框架。

第四個(gè):Echo框架

也是golang的微型Web框架,其具備快速HTTP路由器、支持?jǐn)U展中間件,同時(shí)還支持靜態(tài)文件服務(wù)、Websocket以及支持制定綁定函數(shù),制定相應(yīng)渲染函數(shù),并允許使用任意的HTML模版引擎。

iris 路由注冊(cè)和上下文context

http請(qǐng)求的處理,相較于基本的net/http包,iris框架將http請(qǐng)求(w,*r)及其它上下文,封裝成ctx,逐個(gè)調(diào)用handler閉包進(jìn)行處理,最后分發(fā)函數(shù)返回值(反射)以及響應(yīng)。請(qǐng)求響應(yīng)相當(dāng)于流水線上的一個(gè)商品,被一組當(dāng)中的每個(gè)handler處理。路由注冊(cè)的過(guò)程,在完成之前的方法解析,path解析之后,就需要組裝一個(gè)handler鏈到路由了。

每一步先由api.relativePath和方法傳入的參數(shù)構(gòu)成fullPath。

第二步然后添加handler,順序?yàn)椋?/p>

第三步構(gòu)建Route:

Name格式為defaultName := method + subdomain + 未注值的路徑格式。其中路徑有三個(gè)相關(guān)變量:Subdomain Path FormattedPath。FormattedPath是將path中的:變量替換為%v。構(gòu)建路由Router時(shí)將路徑解析的macroHandler,添加在最前面。

最后將路由注冊(cè)到app.APIBuilder.routes,類型為[]Route。

iris框架定義了handler閉包的操作對(duì)象context.context。不是指TCP的context,也不是net/http中的context。數(shù)據(jù)結(jié)構(gòu)如下:

前文已經(jīng)提過(guò),由于反射字段的不可復(fù)用性,造成go的反射效率下降。如果處理每次的請(qǐng)求都要在運(yùn)行時(shí)重新構(gòu)建context,就會(huì)降低性能。iris用c.pool保存ctx,實(shí)現(xiàn)ctx的可復(fù)用。c.pool的類型是sync.pool。id確定ctx的唯一性,方便保存在c.pool集合中。request writer都是net/http標(biāo)準(zhǔn)庫(kù)的類型,直接傳遞。

params RequestParams 是一個(gè)專用的KV存儲(chǔ),類型為[string]interface{}。用來(lái)保存path param。values用來(lái)保存其它KV信息。

app引用自iris實(shí)例,可以獲取全部的實(shí)例字段。其中路由信息單獨(dú)拿出:currentRouteName路由名,對(duì)應(yīng)c.routes的鍵。路由handlers,currentHandlerIndex。

ctx是可復(fù)用的,需要構(gòu)建ctx時(shí),不是初始化而是直接從池中拿一個(gè)實(shí)例??諏?shí)例僅配置了app字段。第一步包裝net/http包的(w,*r)。第二步根據(jù)request確定路由信息,并賦到ctx相應(yīng)字段。第三步會(huì)執(zhí)行流水線式地Do(handlers),反射調(diào)用得到響應(yīng)信息,并寫(xiě)入到ctx中。最后一步將針對(duì)特定http請(qǐng)求的信息清掉,并放回c.pool。

標(biāo)準(zhǔn)庫(kù)net/http Response

Go-websocket

最近在學(xué)習(xí)Go語(yǔ)言,利用之前的項(xiàng)目作為案例進(jìn)行重構(gòu)。項(xiàng)目背景:php提供TCP服務(wù),硬件連接服務(wù)器需要處理信息,然后將處理的信息在發(fā)送客戶端,客戶端拿到信息展示給用戶。第一種方案客戶端對(duì)發(fā)送信息的接口進(jìn)行輪詢,檢查硬件是否有信息返回,這樣不好太浪費(fèi)資源;第二種方案采用websocket將信息主動(dòng)發(fā)送給客戶端,客戶端做后續(xù)的展示和處理工作;所以最終采用websocket。PHP實(shí)現(xiàn)websocket采用GatewayWorker,經(jīng)過(guò)商業(yè)論證還是很穩(wěn)定的。

在用Go語(yǔ)言重構(gòu)項(xiàng)目的時(shí)候,需要用Go重新搭建Websocket,去網(wǎng)上查了一些資料,利用 gorilla/websocket 在嵌套web框架就可以實(shí)現(xiàn)websocket,目前采用Go語(yǔ)言的iris Web框架,接下來(lái)就說(shuō)說(shuō)我是怎么實(shí)現(xiàn)的。

網(wǎng)站欄目:go語(yǔ)言iris框架設(shè)置 go iris
路徑分享:http://muchs.cn/article34/hgiope.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、定制網(wǎng)站網(wǎng)站制作、網(wǎng)站改版微信小程序網(wǎng)站收錄

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)