真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

go語言gin go語言gin框架

go語言的webengine叫什么

Java教程

成都創(chuàng)新互聯成立十載來,這條路我們正越走越好,積累了技術與客戶資源,形成了良好的口碑。為客戶提供成都網站建設、成都網站制作、網站策劃、網頁設計、國際域名空間、網絡營銷、VI設計、網站改版、漏洞修補等服務。網站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網站建設都非常重要,成都創(chuàng)新互聯通過對建站技術性的掌握、對創(chuàng)意設計的研究為客戶提供一站式互聯網解決方案,攜手廣大客戶,共同發(fā)展進步。

Linux入門

更多

首頁

?

Go語言WEB框架(Gin)詳解

在 Go語言開發(fā)的 Web 框架中,有兩款著名 Web 框架分別是 Martini 和 Gin,兩款 Web 框架相比較的話,Gin 自己說它比 Martini 要強很多。

Gin 是 Go語言寫的一個 web 框架,它具有運行速度快,分組的路由器,良好的崩潰捕獲和錯誤處理,非常好的支持中間件和 json。總之在 Go語言開發(fā)領域是一款值得好好研究的 Web 框架,開源網址:

首先下載安裝 gin 包:

go get -u github.com/gin-gonic/gin

一個簡單的例子:

package main

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

func main() {

//Default返回一個默認的路由引擎

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {

//輸出json結果給調用方

c.JSON(200, gin.H{

"message": "pong",

})

})

r.Run() // listen and serve on 0.0.0.0:8080

}

編譯運行程序,打開瀏覽器,訪問頁面顯示:

{"message":"pong"}

gin 的功能不只是簡單輸出 Json 數據。它是一個輕量級的 WEB 框架,支持 RestFull 風格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上傳,分組路由,Multipart/Urlencoded FORM,以及支持 JsonP,參數處理等等功能,這些都和 WEB 緊密相關,通過提供這些功能,使開發(fā)人員更方便地處理 WEB 業(yè)務。

Gin 實際應用

接下來使用 Gin 作為框架來搭建一個擁有靜態(tài)資源站點,動態(tài) WEB 站點,以及 RESTFull API 接口站點(可專門作為手機 APP 應用提供服務使用)組成的,亦可根據情況分拆這套系統,每種功能獨立出來單獨提供服務。

下面按照一套系統但采用分站點來說明,首先是整個系統的目錄結構,website 目錄下面 static 是資源類文件,為靜態(tài)資源站點專用;photo 目錄是 UGC 上傳圖片目錄,tpl 是動態(tài)站點的模板。

當然這個目錄結構是一種約定,可以根據情況來修改。整個項目已經開源,可以訪問來詳細了解:具體每個站點的功能怎么實現呢?請看下面有關每個功能的講述:

靜態(tài)資源站點

一般網站開發(fā)中,我們會考慮把 js,css,以及資源圖片放在一起,作為靜態(tài)站點部署在 CDN,提升響應速度。采用 Gin 實現起來非常簡單,當然也可以使用 net/http 包輕松實現,但使用 Gin 會更方便。

不管怎么樣,使用 Go 開發(fā),我們可以不用花太多時間在 WEB 服務環(huán)境搭建上,程序啟動就直接可以提供 WEB 服務了。

package main

import (

"net/http"

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

// 靜態(tài)資源加載,本例為css,js以及資源圖片

router.StaticFS("/public", http.Dir("D:/goproject/src/github.com/ffhelicopter/tmm/website/static"))

router.StaticFile("/favicon.ico", "./resources/favicon.ico")

// Listen and serve on 0.0.0.0:80

router.Run(":80")

}

首先需要是生成一個 Engine,這是 gin 的核心,默認帶有 Logger 和 Recovery 兩個中間件。

router := gin.Default()

StaticFile 是加載單個文件,而 StaticFS 是加載一個完整的目錄資源:

func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes

func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes

這些目錄下資源是可以隨時更新,而不用重新啟動程序?,F在編譯運行程序,靜態(tài)站點就可以正常訪問了。

GoLang -- Gin框架

? 何為框架:

框架一直是敏捷開發(fā)中的利器,能讓開發(fā)者很快的上手并做出應用,甚至有的時候,脫離了框架,一些開發(fā)者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創(chuàng)造一個。

Gin是一個golang的微框架,封裝比較優(yōu)雅,API友好,源碼注釋比較明確,已經發(fā)布了1.0版本。具有快速靈活,容錯方便等特點。其實對于golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯??蚣芨袷且恍┏S煤瘮祷蛘吖ぞ叩募稀=柚蚣荛_發(fā),不僅可以省去很多常用的封裝帶來的時間,也有助于團隊的編碼風格和形成規(guī)范。

(1)首先需要安裝,安裝比較簡單,使用go get即可

go get github.com/gin-gonic/gin

如果安裝失敗,直接去Github clone下來,放置到對應的目錄即可。

(2)代碼中使用:

下面是一個使用Gin的簡單例子:

package main

import (

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

router.GET("/ping", func(c *gin.Context) {

c.JSON(200, gin.H{

"message": "pong",

})

})

router.Run(":8080") // listen and serve on 0.0.0.0:8080

}

簡單幾行代碼,就能實現一個web服務。使用gin的Default方法創(chuàng)建一個路由handler。然后通過HTTP方法綁定路由規(guī)則和路由函數。不同于net/http庫的路由函數,gin進行了封裝,把request和response都封裝到gin.Context的上下文環(huán)境。最后是啟動路由的Run方法監(jiān)聽端口。麻雀雖小,五臟俱全。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。

Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數據,詳情可以前往查看。

2.1 匹配參數

我們可以使用Gin框架快速的匹配參數,如下代碼所示:

冒號:加上一個參數名組成路由參數??梢允褂胏.Param的方法讀取其值。當然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。

瀏覽器輸入以下測試:

返回結果為:

其中c.String是gin.Context下提供的方法,用來返回字符串。

其中c.Json是gin.Context下提供的方法,用來返回Json。

下面我們使用以下gin提供的Group函數,方便的為不同的API進行分類。

我們創(chuàng)建了一個gin的默認路由,并為其分配了一個組 v1,監(jiān)聽hello請求并將其路由到視圖函數HelloPage,最后綁定到 0.0.0.0:8000

C.JSON是Gin實現的返回json數據的內置方法,包含了2個參數,狀態(tài)碼和返回的內容。http.StatusOK代表返回狀態(tài)碼為200,正文為{"message": “welcome"}。

注:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解??梢苑奖愕姆祷豀TML數據

我們在之前的組v1路由下新定義一個路由:

下面我們訪問

可以看到,通過c.Param(“key”)方法,Gin成功捕獲了url請求路徑中的參數。同理,gin也可以捕獲常規(guī)參數,如下代碼所示:

在瀏覽器輸入以下代碼:

通過c.Query(“key”)可以成功接收到url參數,c.DefaultQuery在參數不存在的情況下,會由其默認值代替。

我們還可以為Gin定義一些默認路由:

這時候,我們訪問一個不存在的頁面:

返回如下所示:

下面我們測試在Gin里面使用Post

在測試端輸入:

附帶發(fā)送的數據,測試即可。記住需要使用POST方法.

繼續(xù)修改,將PostHandler的函數修改如下

測試工具輸入:

發(fā)送的內容輸入:

返回結果如下:

備注:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。

一定要選擇對應的PUT或者DELETE方法。

Gin框架快速的創(chuàng)建路由

能夠方便的創(chuàng)建分組

支持url正則表達式

支持參數查找(c.Param c.Query c.PostForm)

請求方法精準匹配

支持404處理

快速的返回給客戶端數據,常用的c.String c.JSON c.Data

go語言框架gin之集成swagger

1.先安裝Go對應的開源Swagger相關的庫

go get?github.com/swaggo/swag/cmd/swag

go get github.com/swaggo/gin-swagger

go get?github.com/swaggo/files

go get?github.com/alecthomas/template

2.驗證是否安裝成功:swag -v

3.針對接口寫入注解

// @Summary 獲取多個標簽

// @Tags 標簽

// @Produce? json

// @Param name query string false "標簽名稱" maxlength(100)

// @Param state query int false "狀態(tài)" Enums(0, 1) default(1)

// @Param page query int false "頁碼"

// @Param page_size query int false "每頁數量"

// @Success 200 {object} model.TagSwagger "成功"

// @Failure 400 {object} errcode.Error "請求錯誤"

// @Failure 500 {object} errcode.Error "內部錯誤"

// @Router /api/v1/tags [get]

func (t Tag) List(c *gin.Context) {

}

// @Summary 新增標簽

// @Tags 標簽

// @Produce? json

// @Param name body string true "標簽名稱" minlength(3) maxlength(100)

// @Param state body int false "狀態(tài)" Enums(0, 1) default(1)

// @Param created_by body string false "創(chuàng)建者" minlength(3) maxlength(100)

// @Success 200 {object} model.Tag "成功"

// @Failure 400 {object} errcode.Error "請求錯誤"

// @Failure 500 {object} errcode.Error "內部錯誤"

// @Router /api/v1/tags [post]

func (t Tag) Create(c *gin.Context) {

}

// @Summary 更新標簽

// @Tags 標簽

// @Produce? json

// @Param id path int true "標簽ID"

// @Param name body string false "標簽名稱" minlength(3) maxlength(100)

// @Param state body int false "狀態(tài) (0為未刪除、1為已刪除)" Enums(0, 1) default(1)

// @Param modified_by body string true "修改者" minlength(3) maxlength(100)

// @Success 200 {array} model.Tag "成功"

// @Failure 400 {object} errcode.Error "請求錯誤"

// @Failure 500 {object} errcode.Error "內部錯誤"

// @Router /api/v1/tags/{id} [put]

func (t Tag) Update(c *gin.Context) {

}

4.針對整個項目進行注解,直接在main方法寫入如下注解

//@title 項目名稱

//@version 1.0

//@description 這里是描述

func main() {

5.生成執(zhí)行 swag init

這時會在我項目的docs文件夾下面生成docs.go、swagger.json、swagger.yaml三個文件

6.要在routers中進行默認初始化和注冊對應的路由:

r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

同時要引用 _"blog-service/docs" ,不然會報錯

7.查看接口文檔 :

8.ok,完成

gin是多線程并發(fā)嗎

是的

M代表一個內核線程,也可以稱為一個工作線程。goroutine就是跑在M之上的。(兩個M如果運行在一個CPU上就是并發(fā),如果運行在不同CPU就是并行。)

P 代表著處理器,或是程序執(zhí)行上下文,將等待執(zhí)行的G與M對接。Go的運行時系統會適時地讓P與不同的M建立或斷開關聯,以使P中的那些可運行的G能夠及時獲得運行時機;

G代表協程(是一個輕量級的執(zhí)行線程),可以有多個;

(go采用了基于消息并發(fā)模型的方式。它將基于CSP模型的并發(fā)編程內置到了語言中,通過一個go關鍵字就可以輕易地啟動一個Goroutine,而且在Goroutine之間是共享內存的。)

「go商城」gin+gorm實現CRUD

ORM-Object-Relationl Mapping,即對象關系映射,這里的Relationl指的是關系型數據庫

它的作用是在關系型數據庫和對象之間作一個映射,這樣,我們在具體的操作數據庫的時候,就不需要再去和復雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了

GORM就是go語言實現的一個ORM庫

特點:

增加(Create)

檢索(Retrieve)

更新(Update)

刪除(Delete)

如果模型中有 DeletedAt 字段,它將自動擁有軟刪除的能力!當執(zhí)行刪除操作時,數據并不會永久的從數據庫中刪除,而是將 DeletedAt 的值更新為當前時間。

具體的使用可查看gorm 官方文檔

在項目中我們定義一個全局的GVA_DB,方便使用時調用

后續(xù)我們在需要查詢數據庫時便可直接通過global.GVA_DB使用

比如創(chuàng)建商品信息:

我們先通過查詢分類是否存在,然后再創(chuàng)建商品

通過gorm的鏈式操作可以很方便的進行crud操作

分頁查詢是項目中經常使用到的功能,當指定條件查詢的數據量過大時,如果我們將數據一次性返回,會對數據庫造成較大的負荷,同時降低接口的性能,通常我們會使用分頁查詢的方式讓數據進行分段展示,從而保障接口的性能。在gorm中我們實用Offset,和Count來實現分頁

我們通過前端的傳遞過來的分頁數據進行查詢

該商城作為gin的學習項目,沒有很復雜的邏輯,所有業(yè)務邏輯均通過Mysql實現。包括后面將要介紹的登錄態(tài),也是如此。

所有代碼已上傳github,有興趣的可以訪問,如果有更好的建議也歡迎提交issure,pr

GO語言(十三):使用 Go 和 Gin 開發(fā) RESTful API(下)

當客戶端在 發(fā)出POST請求時/albums,您希望將請求正文中描述的專輯添加到現有專輯數據中。

為此,您將編寫以下內容:

1、編寫代碼

a.添加代碼以將專輯數據添加到專輯列表。

在此代碼中:

1)用于Context.BindJSON 將請求正文綁定到newAlbum。

2) album將從 JSON 初始化的結構附加到albums 切片。

3)向響應添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。

b.更改您的main函數,使其包含該router.POST函數,如下所示。

在此代碼中:

1)將路徑中的POST方法與 /albumspostAlbums函數相關聯。

使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關聯。這樣,您可以根據客戶端使用的方法將發(fā)送到單個路徑的請求單獨路由。

a.如果服務器從上一節(jié)開始仍在運行,請停止它。

b.從包含 main.go 的目錄中的命令行,運行代碼。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。

該命令應顯示添加專輯的標題和 JSON。

d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認添加了新專輯。

該命令應顯示專輯列表。

當客戶端向 發(fā)出請求時GET /albums/[id],您希望返回 ID 與id路徑參數匹配的專輯。

為此,您將:

a.在您在上一節(jié)中添加的函數下方postAlbums,粘貼以下代碼以檢索特定專輯。

此getAlbumByID函數將提取請求路徑中的 ID,然后找到匹配的專輯。

在此代碼中:

(1)Context.Param用于從 URL 中檢索id路徑參數。當您將此處理程序映射到路徑時,您將在路徑中包含參數的占位符。

(2)循環(huán)album切片中的結構,尋找其ID 字段值與id參數值匹配的結構。如果找到,則將該album結構序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應返回。

如上所述,實際使用中的服務可能會使用數據庫查詢來執(zhí)行此查找。

(3)如果找不到專輯,則返回 HTTP 404錯誤。

b.最后,更改您的main,使其包含對router.GET的新調用,路徑現在為/albums/:id ,如以下示例所示。

在此代碼中:

(1)將/albums/:id路徑與getAlbumByID功能相關聯。在 Gin 中,路徑中項目前面的冒號表示該項目是路徑參數。

a.如果服務器從上一節(jié)開始仍在運行,請停止它。

b.在包含 main.go 的目錄中的命令行中,運行代碼以啟動服務器。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。

該命令應顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯誤消息的 JSON。

恭喜!您剛剛使用 Go 和 Gin 編寫了一個簡單的 RESTful Web 服務。

本節(jié)包含您使用本教程構建的應用程序的代碼。


當前文章:go語言gin go語言gin框架
文章地址:http://weahome.cn/article/doddsec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部