Golang項(xiàng)目代碼組織的一些總結(jié)

import

  • import的是目錄,import時(shí)會(huì)從GOROOT中搜索包(標(biāo)準(zhǔn)包)或從GOPATH/src下搜索包,如果GOPATH有多個(gè),則從第一個(gè)開始,直到找到包。import也可以不依賴GOPATH,使用相對(duì)路徑引入,相對(duì)于main包的路徑。
  • package包名是調(diào)用包的時(shí)候使用,一般建議package包名與包所在的目錄保持一致。

go get

  • go get 會(huì)下載包的代碼包并編譯包(.a文件)
  • 如果GOPATH有多個(gè),go get 會(huì)將代碼下載到第一個(gè)GOPATH的src目錄,包編譯到pkg目錄

go instal與go build

  • go install 編譯并安裝包(包括main包),包名為包所在目錄,main包(主程序)會(huì)安裝到bin目錄,其它包會(huì)安裝到pkg目錄。
  • go build 只能編譯main包,包名默認(rèn)為包所在目錄,可通過(guò)-o參數(shù)指定包名。
  • 如果GOPATH中有同名的包,只會(huì)在GOPATH中的第一個(gè)能go install成功,其它的失敗,報(bào)錯(cuò):
    no install location for $GOPATH/go_2/src/myp: hidden by $GOPATH/go_1/src/myp

GOPATH

  • 允許設(shè)置多個(gè)路徑,和各個(gè)系統(tǒng)環(huán)境多路徑設(shè)置一樣,windows用“;”,linux(macOS)用“:”分隔。
  • 如果你無(wú)需導(dǎo)入外部包且使用相對(duì)路徑導(dǎo)入自己的代碼,代碼不一定非要放在GOPATH里,但不推薦這樣做.
  • GOPATH的bin、pkg目錄會(huì)自動(dòng)創(chuàng)建,src目錄放置源代碼,也可不創(chuàng)建src,但需import的包能在GOPATH中找到,且go install時(shí)會(huì)報(bào)錯(cuò):
    go install: no install location for directory GOPATH/m3 outside GOPATH
  • 從Go 1.8開始,將GOPATH設(shè)置為環(huán)境變量不是必需的。如果沒(méi)有設(shè)置或設(shè)置為空,Go使用默認(rèn)的GOPATH為 $HOME/go。

GOBIN

  • go install main包存放的路徑,設(shè)置多個(gè)時(shí),會(huì)被當(dāng)成一個(gè)完整的路徑(列如:/home/bin1:/home/bin2 被視為一個(gè)路徑,也就是不請(qǐng)?jiān)试S設(shè)置多個(gè)路徑)。設(shè)置為空時(shí),放在各自GOPATH目錄的bin文件夾中(前提是:main包的代碼文件不能直接放在GOPATH/src目錄下)。
  • GOBIN為空,且main包的代碼文件在GOPATH/src目錄下時(shí),go install時(shí)報(bào)錯(cuò):
    go install: no install location for .go files listed on command line (GOBIN not set)
    go install: no install location for directory $GOPATH/src outside GOPATH For more details see: 'go help gopath'
  • 解決方法:1、設(shè)置GOBIN,編譯后包名為src。2、將main包代碼放在一個(gè)目錄下,編譯后包名為目錄名。
  • GOBIN沒(méi)有設(shè)置時(shí),使用GOPATH/src/bin,有設(shè)置時(shí)使用設(shè)置。

Go Modules

  • Go modules 是 Go 語(yǔ)言的依賴解決方案,發(fā)布于 Go1.11,成長(zhǎng)于 Go1.12,豐富于 Go1.13,正式于 Go1.14 推薦在生產(chǎn)上使用。
  • 相關(guān)命令
命令 作用
go mod init 生成 go.mod 文件
go mod download 下載 go.mod 文件中指明的所有依賴
go mod tidy 整理現(xiàn)有的依賴
go mod graph 查看現(xiàn)有的依賴結(jié)構(gòu)
go mod edit 編輯 go.mod 文件
go mod vendor 導(dǎo)出項(xiàng)目所有的依賴到vendor目錄
go mod verify 校驗(yàn)一個(gè)模塊是否被篡改過(guò)
go mod why 查看為什么需要依賴某模塊
  • 相關(guān)環(huán)境變量
變量 作用
GO111MODULE auto:項(xiàng)目包含了 go.mod 文件的話啟用 Go modules。on:?jiǎn)⒂?Go modules,推薦設(shè)置,將會(huì)是未來(lái)版本中的默認(rèn)值。off:禁用 Go modules,不推薦設(shè)置。
GOPROXY 設(shè)置 Go 模塊代理,go env -w GOPROXY=https://goproxy.cn,direct
GONOPROXY/GONOSUMDB/GOPRIVATE 當(dāng)前項(xiàng)目依賴了私有模塊,比如私有 git 倉(cāng)庫(kù),或是 github 中的私有庫(kù)時(shí),需要設(shè)置
  • go.mod文件結(jié)構(gòu)
配置 作用
module 用于定義當(dāng)前項(xiàng)目的模塊路徑。
go 用于標(biāo)識(shí)當(dāng)前模塊的 Go 語(yǔ)言版本,值為初始化模塊時(shí)的版本,目前來(lái)看還只是個(gè)標(biāo)識(shí)作用。
require 用于設(shè)置一個(gè)特定的模塊版本。
exclude 用于從使用中排除一個(gè)特定的模塊版本。
replace 用于將一個(gè)模塊版本替換為另外一個(gè)模塊版本。
  • go module導(dǎo)入本地包的方法
    在一個(gè)項(xiàng)目下,直接導(dǎo)入。
    在不同的項(xiàng)目下,使用replace,并使用相對(duì)路徑尋找包:
    require "p1" v0.0.0 (可省略)
    replace "p1" => "../p1"

參考:
Go Modules 終極入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容