1.先安裝Go對(duì)應(yīng)的開源Swagger相關(guān)的庫
目前成都創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、蔚縣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
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.驗(yàn)證是否安裝成功:swag -v
3.針對(duì)接口寫入注解
// @Summary 獲取多個(gè)標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param name query string false "標(biāo)簽名稱" 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 "每頁數(shù)量"
// @Success 200 {object} model.TagSwagger "成功"
// @Failure 400 {object} errcode.Error "請(qǐng)求錯(cuò)誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯(cuò)誤"
// @Router /api/v1/tags [get]
func (t Tag) List(c *gin.Context) {
}
// @Summary 新增標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param name body string true "標(biāo)簽名稱" 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 "請(qǐng)求錯(cuò)誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯(cuò)誤"
// @Router /api/v1/tags [post]
func (t Tag) Create(c *gin.Context) {
}
// @Summary 更新標(biāo)簽
// @Tags 標(biāo)簽
// @Produce? json
// @Param id path int true "標(biāo)簽ID"
// @Param name body string false "標(biāo)簽名稱" 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 "請(qǐng)求錯(cuò)誤"
// @Failure 500 {object} errcode.Error "內(nèi)部錯(cuò)誤"
// @Router /api/v1/tags/{id} [put]
func (t Tag) Update(c *gin.Context) {
}
4.針對(duì)整個(gè)項(xiàng)目進(jìn)行注解,直接在main方法寫入如下注解
//@title 項(xiàng)目名稱
//@version 1.0
//@description 這里是描述
func main() {
5.生成執(zhí)行 swag init
這時(shí)會(huì)在我項(xiàng)目的docs文件夾下面生成docs.go、swagger.json、swagger.yaml三個(gè)文件
6.要在routers中進(jìn)行默認(rèn)初始化和注冊(cè)對(duì)應(yīng)的路由:
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
同時(shí)要引用 _"blog-service/docs" ,不然會(huì)報(bào)錯(cuò)
7.查看接口文檔 :
8.ok,完成
go語言web框架beego安裝(go mod方式)_不忘初心,方得始終-CSDN博客
重要:將bee命令放到GOROOT/bin目錄下,這步很關(guān)鍵
cp bee /usr/local/go/bin/
注:或者可以將GOPATH/bin設(shè)置為環(huán)境變量
echo ’export PATH=" PATH"' ~/.bashrc
source ~/.bashrc
router路由下方法名要大寫,訪問權(quán)限
wq保存
生效環(huán)境變量: source /etc/profile
go build -o abc.exe可指定編譯后的文件名
Golang常用環(huán)境變量說明與設(shè)置詳解
環(huán)境變量GOBIN表示我們開發(fā)程序編譯后二進(jìn)制命令的安裝目錄。
當(dāng)我們使用go install命令編譯和打包應(yīng)用程序時(shí),該命令會(huì)將編譯后二進(jìn)制程序打包GOBIN目錄,一般我們將GOBIN設(shè)置為GOPATH/bin目錄。
export GOBIN=$GOPATH/bin
Go get包管理mod
windows下默認(rèn)項(xiàng)目路徑在go安裝目錄的src下(beego)
基本設(shè)計(jì)思路:
類型轉(zhuǎn)換、類型斷言、動(dòng)態(tài)派發(fā)。iface,eface。
反射對(duì)象具有的方法:
編譯優(yōu)化:
內(nèi)部實(shí)現(xiàn):
實(shí)現(xiàn) Context 接口有以下幾個(gè)類型(空實(shí)現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設(shè)計(jì)思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結(jié),讀寫鎖的設(shè)計(jì)還是非常巧妙的:
設(shè)計(jì)思路:
WaitGroup 有三個(gè)暴露的函數(shù):
部件:
設(shè)計(jì)思路:
結(jié)構(gòu):
Once 只暴露了一個(gè)方法:
實(shí)現(xiàn):
三個(gè)關(guān)鍵點(diǎn):
細(xì)節(jié):
讓多協(xié)程任務(wù)的開始執(zhí)行時(shí)間可控(按順序或歸一)。(Context 是控制結(jié)束時(shí)間)
設(shè)計(jì)思路: 通過一個(gè)鎖和內(nèi)置的 notifyList 隊(duì)列實(shí)現(xiàn),Wait() 會(huì)生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號(hào)通知一個(gè)(Signal())或所有(Boardcast())等待者(內(nèi)部實(shí)現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個(gè)函數(shù):
實(shí)現(xiàn)細(xì)節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯(cuò)誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時(shí)就終止組內(nèi)各協(xié)程。
設(shè)計(jì)思路:
結(jié)構(gòu):
暴露的方法:
實(shí)現(xiàn)細(xì)節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊(duì)借資源(如錢,有借有還)的一種場(chǎng)景。此包相當(dāng)于對(duì)底層信號(hào)量的一種暴露。
設(shè)計(jì)思路:有一定數(shù)量的資源 Weight,每一個(gè) waiter 攜帶一個(gè) channel 和要借的數(shù)量 n。通過隊(duì)列排隊(duì)執(zhí)行借貸。
結(jié)構(gòu):
暴露方法:
細(xì)節(jié):
部件:
細(xì)節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時(shí)的相同請(qǐng)求只調(diào)用一次,response 被所有相同請(qǐng)求共享。
設(shè)計(jì)思路:按請(qǐng)求的 key 分組(一個(gè) *call 是一個(gè)組,用 map 映射存儲(chǔ)組),每個(gè)組只進(jìn)行一次訪問,組內(nèi)每個(gè)協(xié)程會(huì)獲得對(duì)應(yīng)結(jié)果的一個(gè)拷貝。
結(jié)構(gòu):
邏輯:
細(xì)節(jié):
部件:
如有錯(cuò)誤,請(qǐng)批評(píng)指正。
有,go語言有框架,例如:Beego(Go語言下開源的,高性能Web框架 )、Buffalo(Go語言下快速Web開發(fā)框架)、Echo、Gin、Iris、Revel(高生產(chǎn)率,全棧Go語言的Web框架)等。
線程:
多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時(shí)的開銷,進(jìn)程和線程在Linux中沒有本質(zhì)區(qū)別,最大的不同就是進(jìn)程有自己獨(dú)立的內(nèi)存空間,而線程是共享內(nèi)存空間。
在進(jìn)程切換時(shí)需要轉(zhuǎn)換內(nèi)存地址空間,而線程切換沒有這個(gè)動(dòng)作,所以線程切換比進(jìn)程切換代價(jià)要小得多。
協(xié)程:
想要簡(jiǎn)單,又要性能高,協(xié)程就可以達(dá)到我們的目的,它是用戶視角的一種抽象,操作系統(tǒng)并沒有這個(gè)概念,主要思想是在用戶態(tài)實(shí)現(xiàn)調(diào)度算法,用少量線程完成大量任務(wù)的調(diào)度。
Goroutine是GO語言實(shí)現(xiàn)的協(xié)程,其特點(diǎn)是在語言層面就支持,使用起來十分方便,它的核心是MPG調(diào)度模型:M即內(nèi)核線程;P即處理器,用來執(zhí)行Goroutine,它維護(hù)了本地可運(yùn)行隊(duì)列;G即Goroutine,代碼和數(shù)據(jù)結(jié)構(gòu);S及調(diào)度器,維護(hù)M和P的信息。
首先協(xié)程是什么就不多做解釋了,看到這里的同學(xué),我想至少對(duì)協(xié)程已經(jīng)有了理解。
現(xiàn)在很多phper轉(zhuǎn)go開發(fā),大部分都是沖著go的靜態(tài)語言和協(xié)程去的,當(dāng)然還有錢多。
但是php自己其實(shí)也有協(xié)程支持,那就是 swoole 了。
工作原因,有幸接觸了一段時(shí)間swoole和go,希望對(duì)比下兩者的區(qū)別。
首先,網(wǎng)上很多大神關(guān)于swoole和go的對(duì)比,有的還是比較詳細(xì)的。
比如swoole官方就有一個(gè)對(duì)比swoole和go的文章: ;version=1compare=current
知乎大神文章:
感興趣的話,可以 拜讀一下。
文章基本是圍繞,swoole是單進(jìn)程協(xié)程切換,go是MGP模型切換。
swoole 的單進(jìn)程模型 不能共享資源,沒有線程并發(fā)問題,協(xié)程切換依賴io等等。
對(duì)比下來,基本都是go性能比較突出。
確實(shí),go的性能比php高出不少,但同時(shí)也比php的學(xué)習(xí)和使用成本高很多。而且,目前go的開發(fā)框架大都是基于beego或者gin,說好用真實(shí)有點(diǎn)昧良心,相比之下基于swoole的hyperf、mix-php都是開箱即用,包含了大部分需要的功能,二開也成本不高。
總的來說,go的性能確實(shí)比php要高,但是使用成本也高出不少,同時(shí)由于靜態(tài)語言天然的特性,比php這種弱類型語言在開發(fā)時(shí)的成本也要高出不少。
基于協(xié)程的框架,抗并發(fā)性能基本都沒大問題,如果后端存儲(chǔ)能撐得住,server端的并發(fā)基本不會(huì)有問題。
swoole直播案例
文章標(biāo)題:協(xié)程go語言框架sw go協(xié)程模型
文章起源:http://chinadenli.net/article4/hgohoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站制作、面包屑導(dǎo)航、小程序開發(fā)、自適應(yī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í)需注明來源: 創(chuàng)新互聯(lián)