Go組件學(xué)習(xí)——Web框架Gin

以前學(xué)Java的時(shí)候龟虎,和Spring全家桶打好關(guān)系就行了锋勺,從Spring变丧、Spring MVC到SpringBoot芽狗,一脈相承。

對于一個(gè)Web項(xiàng)目痒蓬,使用Spring MVC童擎,就可以基于MVC的思想開發(fā)項(xiàng)目了,不管是應(yīng)對前后端分離還是不分離的場景攻晒,你都可以輕松駕馭顾复。因?yàn)槟阒灰溃阌玫氖且粋€(gè)Web開發(fā)框架就行了鲁捏。

相比于Spring在Java一家獨(dú)大的局面芯砸,Go生態(tài)中的Web框架還在百家爭鳴的階段。從今天開始學(xué)習(xí)一款基于Go語言開發(fā)的Web開發(fā)框架Gin。

簡介

Github:https://github.com/gin-gonic/gin

語言:Go語言

官網(wǎng):https://gin-gonic.com/

環(huán)境搭建

Go版本:1.12.4

系統(tǒng):macOS

依賴管理工具:go mod

IDE:Goland

因?yàn)槲沂褂昧薵o mod假丧,所以引用gin的依賴算是很方便了双揪。

如何創(chuàng)建一個(gè)go mod管理的新項(xiàng)目以及如何將老項(xiàng)目改造為go mod,可以參見這篇文章:https://juejin.im/post/5c8e503a6fb9a070d878184a包帚,寫的很詳細(xì)了渔期。

20191117-1-go mod文件.png

這就是我的go-demo:https://github.com/DMinerJackie/go-demo項(xiàng)目的所有第三方依賴了。

那么如何添加gin的依賴呢婴噩?有以下三種方式

  • 直接新建一個(gè)基于gin的example程序文件擎场,然后執(zhí)行go build xxx.go或者go run xxx.go命令,go mod就會自動幫你下載gin依賴并更新go.mod文件几莽。

  • 同上迅办,還是新建一個(gè)example程序文件,然后在項(xiàng)目根目錄下執(zhí)行go mod tidy命令章蚣,go mod會幫你安排上站欺。這個(gè)命令可以幫助你移除不需要的依賴,并拉取引用你需要的依賴纤垂。

  • 在go.mod文件中手動添加依賴類似github.com/gin-gonic/gin v1.4.0這種矾策。

幾乎不用什么繁瑣的步驟,就完成了環(huán)境搭建峭沦。下面開始寫第一個(gè)基于Gin的demo

第一個(gè)Demo

1贾虽、新建文件helloworld.go

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // 監(jiān)聽并在 0.0.0.0:8080 上啟動服務(wù)
}

2、點(diǎn)擊執(zhí)行該程序

20191117-2-運(yùn)行helloworld.gif

從控制臺程序可以看出服務(wù)已經(jīng)啟動吼鱼,并且開始監(jiān)聽8080端口

3蓬豁、訪問接口

接下來我們在瀏覽器輸入localhost:8080/ping即可看到程序返回的結(jié)果

20191117-3-運(yùn)行helloworld.gif

一個(gè)極簡的Web服務(wù)器就這樣搭建完成并對外訪問了。

上面的代碼中

通過r := gin.Default()聲明一個(gè)gin的引擎菇肃,后續(xù)的操作都是基于這個(gè)引擎的地粪。

通過r.GET申明一個(gè)可以訪問的路由,定義的HTTP請求方式為GET請求琐谤。同時(shí)定義了請求后對應(yīng)的處理方式蟆技,即一個(gè)閉包函數(shù)聲明以JSON格式返回的鍵值對。

通過r.Run()監(jiān)聽指定端口并啟動服務(wù)

其他Demo

1斗忌、渲染HTML

雖然現(xiàn)在很多都倡導(dǎo)并實(shí)行前后端分離了质礼,即后端只提供HTTP接口,前端負(fù)責(zé)調(diào)用HTTP接口以及頁面渲染织阳。

但還是有前后端揉在一起的使用場景眶蕉,gin就提供了這種能力。

具體的做法是提供一個(gè)HTML模板陈哑,服務(wù)端將得到的數(shù)據(jù)填充到模板中實(shí)現(xiàn)頁面的渲染泳桦。

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("main/src/gin-example/examples/templates/**/*")
    router.GET("/posts/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
            "title": "Posts",
        })
    })
    router.GET("/users/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
            "title": "Users",
        })
    })
    router.Run(":8080")
}

index.tmpl

{{ define "posts/index.tmpl" }}
<html><h1>
    {{ .title }}
</h1>
<p>Using posts/index.tmpl</p>
</html>
{{ end }}

user.tmpl

{{ define "users/index.tmpl" }}
<html><h1>
    {{ .title }}
</h1>
<p>Using users/index.tmpl</p>
</html>
{{ end }}

對應(yīng)的HTML模板文件目錄結(jié)構(gòu)如下

20191117-4-目錄結(jié)構(gòu).gif

代碼部分

router.LoadHTMLGlob用于指明HTML模板文件的路徑

router.GET同上,定義訪問路由和返回結(jié)果透典,不同于第一個(gè)Demo的是,這里有賦值填充的過程厘贼,比如

c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
            "title": "Posts",
        })

將index.tmpl中定義的.title替換為"Posts"

執(zhí)行結(jié)果如下

20191117-5-模板運(yùn)行.gif

2、PureJSON

func main() {
    r := gin.Default()
    
    // 提供 unicode 實(shí)體
    r.GET("/json", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "html": "<b>Hello, 世界!</b>",
        })
    })
    
    // 提供字面字符
    r.GET("/purejson", func(c *gin.Context) {
        c.PureJSON(200, gin.H{
            "html": "<b>Hello, 世界!</b>",
        })
    })
    
    // 監(jiān)聽并在 0.0.0.0:8080 上啟動服務(wù)
    r.Run(":8080")
}

這里兩個(gè)GET方法唯一不同的就是要渲染的內(nèi)容一個(gè)使用JSON()方法一個(gè)使用PureJSON()方法圣拄。

啟動程序后嘴秸,我們看下訪問結(jié)果有什么不同

20191117-6-purejso.gif

可以看出JSON()渲染的會有中文以及標(biāo)簽轉(zhuǎn)為unicode編碼,但是使用PureJSON()渲染就是原樣輸出(我的瀏覽器裝了插件庇谆,會自動解碼岳掐,所以不點(diǎn)擊右邊的”RAW“兩個(gè)接口返回的結(jié)果是一樣的)。

這個(gè)問題饭耳,本周我們服務(wù)端在和客戶端對接的時(shí)候還遇到了串述,因?yàn)榭蚣芊祷氐腏SON串就是經(jīng)過編碼的,但是單獨(dú)請求放到瀏覽器是沒有問題的寞肖,客戶端收到的卻是經(jīng)過編碼的纲酗,最后排查發(fā)現(xiàn)是瀏覽器插件解碼了。

3新蟆、渲染多種數(shù)據(jù)交換格式的數(shù)據(jù)

gin支持渲染XML觅赊、JSON、YAML和ProtoBuf等多種數(shù)據(jù)格式

import (
    "github.com/gin-gonic/gin"
    "github.com/gin-gonic/gin/testdata/protoexample"
    "net/http"
)

func main() {
    r := gin.Default()

    // gin.H 是 map[string]interface{} 的一種快捷方式
    r.GET("/someJSON", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
    })

    r.GET("/moreJSON", func(c *gin.Context) {
        // 你也可以使用一個(gè)結(jié)構(gòu)體
        var msg struct {
            Name    string `json:"user"`
            Message string
            Number  int
        }
        msg.Name = "Lena"
        msg.Message = "hey"
        msg.Number = 123
        // 注意 msg.Name 在 JSON 中變成了 "user"
        // 將輸出:{"user": "Lena", "Message": "hey", "Number": 123}
        c.JSON(http.StatusOK, msg)
    })

    r.GET("/someXML", func(c *gin.Context) {
        c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
    })

    r.GET("/someYAML", func(c *gin.Context) {
        c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
    })

    r.GET("/someProtoBuf", func(c *gin.Context) {
        reps := []int64{int64(1), int64(2)}
        label := "test"
        // protobuf 的具體定義寫在 testdata/protoexample 文件中琼稻。
        data := &protoexample.Test{
            Label: &label,
            Reps:  reps,
        }
        // 請注意吮螺,數(shù)據(jù)在響應(yīng)中變?yōu)槎M(jìn)制數(shù)據(jù)
        // 將輸出被 protoexample.Test protobuf 序列化了的數(shù)據(jù)
        c.ProtoBuf(http.StatusOK, data)
    })

    // 監(jiān)聽并在 0.0.0.0:8080 上啟動服務(wù)
    r.Run(":8080")
}

今天先到這,后面再看看gin的源碼帕翻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸠补,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熊咽,更是在濱河造成了極大的恐慌莫鸭,老刑警劉巖闹丐,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件横殴,死亡現(xiàn)場離奇詭異,居然都是意外死亡卿拴,警方通過查閱死者的電腦和手機(jī)衫仑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕花,“玉大人文狱,你說我怎么就攤上這事≡低欤” “怎么了瞄崇?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵呻粹,是天一觀的道長。 經(jīng)常有香客問我苏研,道長等浊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任摹蘑,我火速辦了婚禮筹燕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衅鹿。我一直安慰自己撒踪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布大渤。 她就那樣靜靜地躺著制妄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泵三。 梳的紋絲不亂的頭發(fā)上忍捡,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音切黔,去河邊找鬼砸脊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纬霞,可吹牛的內(nèi)容都是我干的凌埂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诗芜,長吁一口氣:“原來是場噩夢啊……” “哼瞳抓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伏恐,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤孩哑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后翠桦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體横蜒,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年销凑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丛晌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斗幼,死狀恐怖澎蛛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜕窿,我是刑警寧澤谋逻,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布呆馁,位于F島的核電站,受9級特大地震影響毁兆,放射性物質(zhì)發(fā)生泄漏智哀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一荧恍、第九天 我趴在偏房一處隱蔽的房頂上張望瓷叫。 院中可真熱鬧,春花似錦送巡、人聲如沸摹菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽次氨。三九已至,卻和暖如春摘投,著一層夾襖步出監(jiān)牢的瞬間煮寡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工犀呼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幸撕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓外臂,卻偏偏與公主長得像坐儿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子宋光,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)發(fā)自:http://shanshanpt.github.io/2016/05/03/go-gin.html gi...
    dncmn閱讀 6,044評論 0 1
  • 所謂框架 框架一直是敏捷開發(fā)中的利器貌矿,能讓開發(fā)者很快的上手并做出應(yīng)用,甚至有的時(shí)候罪佳,脫離了框架逛漫,一些開發(fā)者都不會寫...
    人世間閱讀 216,199評論 11 242
  • Go語言web框架學(xué)習(xí)—Gin 開發(fā)環(huán)境:操作系統(tǒng):ubuntu1804 x64Golang 版本:go1.12....
    蔻蔻噠閱讀 1,658評論 0 1
  • 給大家講講我小時(shí)候生活過的地方,人都有長大的一天赘艳,正如那首歌中所唱酌毡,我不想不想長大,可是沒辦法第练,一個(gè)人總要面對長大...
    穆清遠(yuǎn)閱讀 392評論 0 1
  • 這兩天我好郁悶阔馋。感覺玛荞。寶寶的爸爸娇掏,越看越不順眼。什么事情勋眯,都讓我看得很不順心婴梧。每次讓她抱著寶寶下梢,干一下活,他都會抱...
    小佳丶_ebcd閱讀 227評論 0 0