準(zhǔn)備學(xué)習(xí)go語(yǔ)言枣察,打算用go的gin框架來(lái)寫(xiě)寫(xiě)web接口争占。然而用文檔的教程來(lái)運(yùn)行,卻死活都跑不起來(lái)序目,寫(xiě)下問(wèn)題和解決方法臂痕,讓遇到問(wèn)題的同伴早日脫離苦海
首先簡(jiǎn)單的說(shuō)下正常要運(yùn)行一個(gè)項(xiàng)目步驟,我是windows環(huán)境:
?安裝golang
1. 下載安裝包安裝
2. 在cmd中輸入go回車猿涨,有輸出則說(shuō)明安裝正常
3. 一般安裝的時(shí)候程序會(huì)自動(dòng)添加握童,無(wú)需人工干預(yù)
檢查GOPATH
1. 可以在cmd中查看set GOPATH
2. 或者在"我的電腦"-"屬性"-"高級(jí)"-"環(huán)境變量"中查看和添加
3. 正常go安裝,會(huì)自動(dòng)添加叛赚,我本機(jī)GOPATH=C:\Users\Administrator\go澡绩;
安裝gin
1. 接下來(lái)安裝gin,框架文檔介紹:go get -u github.com/gin-gonic/gin
2. 這時(shí)候開(kāi)始遇到問(wèn)題了俺附,常遇問(wèn)題資源加載不了肥卡,解決方法是使用代理(這塊有個(gè) go env 的命令,可以查看當(dāng)前配置)昙读,在cmd中運(yùn)行:
? go env -w GO111MODULE=on
? ?go env -w GOPROXY=https://goproxy.io,direct
3. 設(shè)置后召调,重新運(yùn)行: go get -u github.com/gin-gonic/gin,可以很快速的安裝
運(yùn)行項(xiàng)目?
1. 在C:\Users\Administrator\go\ 下創(chuàng)建 src/gin/ 文件夾,創(chuàng)建main.go 文件唠叛,添加文檔說(shuō)的代碼
package main
import "github.com/gin-goinc/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 (for windows "localhost:8080")
}
2. 在cmd中只嚣,進(jìn)入C:\Users\Administrator\go\src\gin\目錄,運(yùn)行命令:? go run .\main.go
3. 這時(shí)候問(wèn)題又來(lái)了艺沼,報(bào)錯(cuò):main.go:3:8: cannot find module providing package github.com/gin-gonic/gin: working directory is not part of a module
4. 解決方法册舞,當(dāng)前目錄分別運(yùn)行下面兩句代碼:
? go mod init gin
? go mod edit -require github.com/gin-gonic/gin@latest
5. 上面運(yùn)行后,再運(yùn)行 ?go run .\main.go障般,就可行了调鲸。這其中涉及到go mod包依賴管理 ,類似前端npm的package.json挽荡,有興趣可以深入了解
問(wèn)題回顧
上面幾點(diǎn)只是說(shuō)明解決方法藐石,這其中遇到的問(wèn)題,甚至一度懷疑我安裝的版本有問(wèn)題
1. 我使用的是go 1.14.2定拟,在運(yùn)行g(shù)in的時(shí)候 go run .\main.go 于微,會(huì)報(bào)錯(cuò): main.go:3:8: cannot find module providing package github.com/gin-gonic/gin: working directory is not part of a module
2. 此時(shí)經(jīng)過(guò)幾次調(diào)試,發(fā)現(xiàn)如果運(yùn)行?go env -w GO111MODULE=off(關(guān)閉模塊管理)報(bào)錯(cuò)變成
main.go:3:8: cannot find package "github.com/gin-gonic/gin" in any of: c:\go\src\github.com\gin-gonic\gin (from $GOROOT) C:\Users\Administrator\go\src\github.com\gin-gonic\gin (from $GOPATH)
3. 這時(shí)?cannot find package "" in any of 這個(gè)報(bào)錯(cuò)青自,就把我引到到設(shè)置GOPATH問(wèn)題集合上株依,調(diào)試很久,發(fā)現(xiàn)并不能解決
4. 此時(shí)我懷疑起了代理設(shè)置延窜,特別是go get 之后包是放在 ?$GOPATH\src\pkg下的恋腕,教程說(shuō)是在src下面的,這點(diǎn)很是詭異逆瑞, 當(dāng) go env -w GO111MODULE=off?(關(guān)閉模塊管理)荠藤,這個(gè)時(shí)候go get 命令是不走代理,而是走實(shí)際地址获高,下載速度異常慢商源,經(jīng)常下載失敗,但是模塊包能被下載到 $GOPATH/src目錄下谋减,這點(diǎn)和網(wǎng)上說(shuō)的go目錄結(jié)構(gòu)一致牡彻,此時(shí)在main.go中 import 包,運(yùn)行也不會(huì)報(bào)錯(cuò)( gin的包比較大出爹,正常是下載失敗的庄吼,我當(dāng)時(shí)用go get github.com/astaxie/beedb試了另一個(gè)包)
5. gin用go get 下載是不會(huì)成功的,我直接在github下載包放在 $GOPATH/src 下严就,但是缺少依賴总寻,無(wú)法運(yùn)行,后續(xù)又把?$GOPATH\src\pkg\mod中的包復(fù)制到 $GOPATH\src梢为,還是不能運(yùn)行渐行。
6. 最后發(fā)現(xiàn)gin中有個(gè)go.mod的文件轰坊,查閱了相關(guān)資料,才找到解決方法祟印。
總結(jié)
? ? ?在使用 GOPROXY 的時(shí)候肴沫,開(kāi)啟了 GO111MODULE,導(dǎo)致包管理非官方所說(shuō)的在? $GOPATH\src\蕴忆,而是去了 $GOPATH\src\pkg\目錄下颤芬,此時(shí)就需要用go mod引入這些包 require github.com/gin-gonic/gin@latest ,解決import獲取不了包的問(wèn)題套鹅。