0x00 前言
- 面向讀者:
第一次在Windows
環(huán)境構(gòu)建go
開發(fā)環(huán)境.- 本文目的
學(xué)習(xí)使用gin
進(jìn)行接口開發(fā), 并為此接口服務(wù)添加swagger
接口文檔功能- 注意:
請(qǐng)自帶梯子
0x01 環(huán)境
本文開發(fā)環(huán)境為Windows 7
, 所以這里以 win 7
為例進(jìn)行介紹.
- 下載安裝包
首先在官網(wǎng)https://golang.org/dl/, 選擇msi
安裝包.
-
安裝
大力雙擊下載到的安裝文件, 我們這里把它安裝到D:\go
目錄
安裝 創(chuàng)建工作目錄
手動(dòng)創(chuàng)建目錄D:\go_base
, 這個(gè)目錄就是將來go
的依賴庫下載目錄 ,
同時(shí),也是我們添加新項(xiàng)目所在的目錄.
這里和
java
的工作機(jī)制不太一樣.
不過感覺這種設(shè)定也挺好的,不用"滿地圖"到處找代碼 :-)
- 環(huán)境變量設(shè)定
GO
開頭的環(huán)境變量如下:
GOARCH=amd64
GOBIN=D:\go\bin
GOOS=windows
GOPATH=D:\go_base
GOROOT=D:\go
配置完成后, 打開一個(gè)新的命令行窗口, 能正常執(zhí)行 go env
表示安裝配置成功.
- 配置
GoLand
打開Goland
的設(shè)置畫面, 點(diǎn)選并設(shè)置GO
下面的兩個(gè)選項(xiàng):
GOROOT
GOPATH
到這里, 開發(fā)環(huán)境已經(jīng)基本配置完成 .
0x02 創(chuàng)建第一個(gè)Go
版本的api
項(xiàng)目
Go
語言版本的RestApi
框架有很多, 這里我們以https://github.com/gin-gonic/gin 作為學(xué)習(xí)對(duì)象.
- 手動(dòng)下載
gin
依賴項(xiàng)
打開命令行窗口, 執(zhí)行命令:
go get -u github.com/gin-gonic/gin
執(zhí)行正常結(jié)束后, 會(huì)在
%GOPATH%\src\github.com\gin-gonic\gin
目錄下多出一大票代碼.
如你所想, 這個(gè)命令, 就是把github
上的代碼下載到本地了.
one more thing
Go
編譯成功后, 只有一個(gè)執(zhí)行文件(便于發(fā)布?).
因此, 就不難理解 , 為什么下載依賴, 其實(shí)就是把依賴的源碼給拉下來了.
-
創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)新的Go
工程, 注意選擇路徑為%GOPATH%\src\項(xiàng)目名稱
image.png
設(shè)置好目錄后, 下一步, 就直接到了開發(fā)主界面了.
好簡(jiǎn)潔呀,一個(gè)文件都沒有 O_O
主界面 編寫代碼
好吧, 我們還是進(jìn)入正題, 參考gin
官網(wǎng)示例程序,導(dǎo)入測(cè)試代碼.
我們?cè)陧?xiàng)目中手動(dòng)創(chuàng)建一個(gè)main.go
文件,內(nèi)容如下
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() // listen and serve on 0.0.0.0:8080
}
- 運(yùn)行
一般的, 我們寫一個(gè)go
文件, 如果package main
下面, 再有一個(gè)func main()
的話, 那么這個(gè)main()
就是程序 的入口了.
我們可以直接在IDE
上 輕戳邊上的小三角, 啟動(dòng)程序.
- 驗(yàn)證
程序啟動(dòng)后, 我們就可以 訪問 http://localhost:8080/ping此接口, 查看效果:
哇, 這代碼量, 比
SpringBoot
少了不是一點(diǎn)半點(diǎn)啊, 點(diǎn)贊
到這里呢, 框架開發(fā)的流程已經(jīng)走完了, 接下來開發(fā)的部分, 參考文檔慢慢學(xué)習(xí).
0x03 導(dǎo)入 SwaggerUI
作為一個(gè)不愛寫文檔, 又恨別人不寫文檔的的程序員, 我們當(dāng)然選擇
Swagger
來做為接口說明輸出啦.
這個(gè)神器可是Spring
項(xiàng)目的標(biāo)配了,go
開發(fā)的接口當(dāng)然也不能放松要求.
我們使用https://github.com/swaggo/gin-swagger作為 swagger
接入方案.
跟上面的流程一樣, 我們先下載依賴
go get -u github.com/swaggo/swag/cmd/swag
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files
go get -u github.com/alecthomas/template
-
開始導(dǎo)入
在項(xiàng)目根目錄(main.go
所在目錄 ) , 執(zhí)行命令行:swag init
,會(huì)在項(xiàng)目目錄下生成一堆文件.
swag init 修改代碼
要增加的代碼太零散, 直接上完成代碼
其中
DOC
主體注釋寫法參考
https://swaggo.github.io/swaggo.io/declarative_comments_format/general_api_info.htmlAPI
上面的注釋寫法請(qǐng)參考
https://swaggo.github.io/swaggo.io/declarative_comments_format/api_operation.html
package main
import (
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
"github.com/swaggo/gin-swagger"
_ "hello_gin/docs"
)
// @title 國(guó)服最坑開發(fā)
// @version 1.0.1
// @description 神奇的API.
// @termsOfService http://swagger.io/terms/
// @contact.name API Support
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host localhost:8080
// @BasePath /
func main() {
r := gin.Default()
url := ginSwagger.URL("http://localhost:8080/swagger/doc.json") // The url pointing to API definition
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
r.GET("/ping", pong)
r.Run() // listen and serve on 0.0.0.0:8080
}
// Ping Pong
// @Summary Ping Pong
// @Description get string by ID
// @Tags 健康檢測(cè)
// @Produce json
// @Success 200
// @Router /ping [get]
func pong(ctx * gin.Context) {
ctx.JSON(200, gin.H{
"message": "pong",
})
}
注意
每次修改注釋后, 都要執(zhí)行swag init
, 然后再啟動(dòng)服務(wù)進(jìn)行驗(yàn)證
- 驗(yàn)證
啟動(dòng)服務(wù)后,打開網(wǎng)頁 http://localhost:8080/swagger/index.html, 查看效果:
0x04 后記
為什么要搞
golang
?
最近線上發(fā)現(xiàn)在用java
作計(jì)算密集型的操作時(shí), 時(shí)間消耗有點(diǎn)大.
就想著是否要另外一種語言來作替代實(shí)現(xiàn).
生命不息, 折騰不止, go
起來
體驗(yàn):
這一篇只是剛剛開始, 關(guān)于
swagger
熟練使用, 還有很長(zhǎng)路要走.
對(duì)比java
版的swagger
, 感覺java
的好像更簡(jiǎn)單一點(diǎn)?
不不不, 只是自己還沒熟練吧, 哈哈