搭建go環境和初始化專案
轉:https://www.cnblogs.com/caibaotimes/p/14780816.html
Go的安裝
補充說明:由於VS Code對go mod模式的支援暫時還不夠完善,建議大家使用Goland編輯器。
安裝基本還是之前的老樣子,不過現在的安裝早已省事不少,不再需要配置環境變數。直接去官網,下載了安裝包後直接安裝即可
在Go中文網進行Go最新版安裝包的下載(或者複製網址瀏覽器開啟https://studygolang.com/dl)
不管是Windows還是MacOS都是非常簡單快捷,將安裝包下載好後直接一步到位next即可
Linux下的安裝,就是將下載的Linux安裝包中的go
資料夾,解壓到/usr/local
在控制檯輸入go version
,如果顯示了版本號,即代表安裝成功
Go環境變數的配置
安裝成功後,環境變數的配置也沒有以前那麼麻煩
僅需要幾步操作即可
1、設定GOPATH路徑(GOPATH路徑是我們的工作區)
Copy go env -w GOPATH=我們自己的工作區路徑
例如我的就設為 /Users/naonao/go
2、什麼都別管,先開啟GoMOD,再配置代理
在這裡感謝「七牛雲」為我們中國區的Golang開發者提供的代理服務
Copy $ go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,direct
3、重要的環境變數
Go
通過環境變數來做專案上的管理和控制,通過命令 go env
可以檢視相關變數:
Copy C:\Users\user>go env
set GO111MODULE=on
set GOPATH=E:\go
set GOPROXY=https://goproxy.cn,direct
set GOROOT=D:\install\Go
set GOSUMDB=sum.golang.org
關鍵環境變數:
GOROOT
: Go
的安裝目錄,即可執行檔案所在的目錄;
GOPATH
:工作目錄並不是專案所有目錄,編譯後的二進位制檔案存放地, import
包的搜尋路徑,主要包含 bin
pkg
、 src
;
GO111MODULE
:啟用 go module
管理專案,需要有 go.mod
和 go.sum
檔案;
GOPROXY
:下載依賴時的代理,必須配置,不然無法成功下載;
常用的代理有:
Copy # 1. 七牛 CDN
export GOPROXY=https://goproxy.cn,direct
# 2. 阿里雲
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
export GOPROXY=https://goproxy.io,direct
初始化專案
GO專案目錄解釋
src存放原始碼
pkg編譯後生成的檔案
bin編譯後生成的可執行檔案
新建go專案目錄,並在專案的src目錄中建立hello目錄
Copy # 建立project的目錄
$ mkdir gproject
# 進入目錄
$ cd gproject/
# 初始化
E:\go>go mod init gproject
go: creating new go.mod: module gproject
在該目錄中建立一個main.go
檔案:
Copy package main // 宣告 main 包,表明當前是一個可執行程式
import "fmt" // 匯入內建 fmt 包
func main(){ // main函式,是程式執行的入口
fmt.Println("Hello World!") // 在終端列印 Hello World!
}
執行或編譯後執行:
Copy # 直接run
$ go run main.go
# 編譯成二進位制檔案
$ go build
# 執行二進位制檔案
go install
go install
表示安裝的意思,它先編譯原始碼得到可執行檔案,然後將可執行檔案移動到GOPATH
的bin目錄下。因為我們的環境變數中配置了GOPATH
下的bin目錄,所以我們就可以在任意地方直接執行可執行檔案了。
跨平臺編譯
預設我們go build
的可執行檔案都是當前作業系統可執行的檔案,如果我想在windows下編譯一個linux下可執行檔案,那需要怎麼做呢?
只需要指定目標作業系統的平臺和處理器架構即可:
Copy SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目標平臺是linux
SET GOARCH=amd64 // 目標處理器架構是amd64
使用了cgo的程式碼是不支援跨平臺編譯的
然後再執行go build
命令,得到的就是能夠在Linux平臺執行的可執行檔案了。
Mac 下編譯 Linux 和 Windows平臺 64位 可執行程式:
Copy CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下編譯 Mac 和 Windows 平臺64位可執行程式:
Copy CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下編譯Mac平臺64位可執行程式:
Copy SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build
問題:
1、$GOPATH/go.mod exists but should not
開啟模組支援後,並不能與GOPATH
共存,所以把專案從GOPATH
中移出即可
2、解決go 生成的exe不在bin資料夾裡的問題
解決
控制檯執行go install
補充:go install之後沒有生成bin目錄的原因(環境變數GOBIN)
執行go install HelloWorld,沒有報錯,但工作空間裡也沒有生成bin目錄。
想起剛才重新配置環境變數時,把GOBIN也給配置了:/usr/local/go/bin。
所以導致install生成的bin並沒在當前工作空間生成對應打bin目錄,而是把檔案直接生成到裡/usr/local/go/bin裡。
把GOBIN重新置為了預設的空,source之後並沒成功。
因為用的LiteIDE,它打環境變數沒有更新過來,重啟LiteIDE也沒好使。
最後把系統登出重新登入了一下好使了
goland使用go mod模式
第一步:建立空資料夾
第二步:goland以專案方式開啟資料夾
第三步:設定goland中的配置,goroot,gomodule
第四步:執行go mod init + 專案名,這個截圖的地方多一個go modules,用於存放下載的包的
第五步:建立.go檔案,然後寫上程式碼
第六步:執行go mod tidy,下載所需的包,也會刪除多餘的包
在執行命令go mod tidy
時,Go module 會自動整理go.mod 檔案
go.mod的內容:
專案名
go 的版本
第三方的包
注意開啟go mod 模式後 go get 下載的包都在 go/pkg 目錄下
將自動下載依賴包並解壓,go get 總是獲取最新版本的包
如果包的版本更新了,go get 命令將自動修改go.mod檔案
go.sum 該檔案記錄了所依賴包的hash值,確保依賴包沒有被篡改
注意:
經go get 修改的go.mod和go.sum都需要提交的程式碼庫,
這樣別人獲取專案程式碼並編譯時 就會使用專案所要求的以來版本。
本地儲存使用包,命令
Copy go mod vendor
執行該命令後,會出現一個vendor資料夾,裡面就是你引用的所有包,由此就可以看出,使用mod後,已經不用依賴於原始的gopath,靈活性更高了。
如果使用過程中有包的變動等,可以使用其他命令輔助,比如go mod tidy,整理你的包目錄。
go mod 的指令
go.mod檔案中通過指令宣告module資訊,用於控制命令列工具進行版本選擇。一共有四個指令可供使用:
Copy module: 宣告module名稱;
require: 宣告依賴以及其版本號;
replace: 替換require中宣告的依賴,使用另外的依賴及其版本號;
exclude: 禁用指定的依賴;
go.sum 檔案
引入原由:
為了確保一致性構建,Go引入了go.mod檔案來標記每個依賴包的版本,在構建過程中go命令會下載go.mod中的依賴包,下載的依賴包會快取在本地,以便下次構建。
考慮到下載的依賴包有可能是被黑客惡意篡改的,以及快取在本地的依賴包也有被篡改的可能,單單一個go.mod檔案並不能保證一致性構建
為了解決Go module的這一安全隱患,Go開發團隊在引入go.mod的同時也引入了go.sum檔案,用於記錄每個依賴包的雜湊值
在構建時,如果本地的依賴包hash值與go.sum檔案中記錄得不一致,則會拒絕構建。
vscode 配置go環境
Go的安裝
推薦Go官網安裝,也可以在Go中文網下載。
可以一直預設,也可以根據自己放到想要的路徑。
VSCodede的安裝
推薦VSCode官網下載,下載地址。
安裝步驟也是一路next,路徑選擇根據個人。
配置Go mod映象
1、開啟gomod,再配置代理
Copy $ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
通過命令 go env 可以檢視相關變數
常用的代理有:
# 1. 七牛 CDN
export GOPROXY=https://goproxy.cn,direct
# 2. 阿里雲
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
export GOPROXY=https://goproxy.io,direct
VSCode的配置)
然後點選右邊的Install即可(我的是已經安裝過的所以這樣顯示)
2. 建立一個專案(資料夾)然後開啟他(左上角的File -> Open Folder)
3. 然後點選下方的TERMINAL,輸入命令go mod init 你的專案名稱,執行該命令後,執行的目錄下面就會出現一個go.mod檔案
4. 新建一個Go檔案, VSCode會啟用Go外掛,提示的工具全部安裝就行了
5. 然後繼續在TERMINAL中手動執行go檔案,輸入指令go run 檔名
Copy go run main.go
一些踩坑經驗
當你開啟了GO111MODULE
,仍然使用GOPATH模式的方法,在引入自定義模組時會報錯。
GO111MODULE 有三個值:off, on和auto(預設值)。
- GO111MODULE=off,go命令列將不會支援module功能,尋找依賴包的方式將會沿用舊版本那種通過vendor目錄或者GOPATH模式來查詢。
- GO111MODULE=on,go命令列會使用modules,而一點也不會去GOPATH目錄下查詢。
- GO111MODULE=auto,預設值,go命令列將會根據當前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:
- 當前目錄在GOPATH/src之外且該目錄包含go.mod檔案
- 當前檔案在包含go.mod檔案的目錄下面。
當modules 功能啟用時,依賴包的存放位置變更為$GOPATH/pkg,允許同一個package多個版本並存,且多個專案可以共享快取的 module。
(1)使用了相對路徑:import "./models"
報錯:build command-line-arguments: cannot find module for path /D/dev這裡後面一堆本地路徑
這是因為在go module下 你原始碼中 impot …/ 這樣的引入形式不支援了, 應該改成 impot 模組名/ 。 這樣就ok了
(2)使用結合了GOPATH的形式:import "Go-Player/src/ademo/models"
於是我們把上面的import改成了結合GOPATH的如上形式
- 報錯:package Go-Player/src/ademo/models is not in GOROOT D:/development/go/src/GPlayer/src/ademo/models
(3)徹底解決方法:用go env -u 恢復初始設定
不再使用go mod:
- go env -w GO111MODULE=off 或者 go env -w GO111MODULE=auto
- go env -u GO111MODULE
區別在於,如果GO111MODULE=on或者auto,在go get下載包時候,會下載到GOPATH/pkg/mod,引入時也是同樣的從這個目錄開始。如果這行了上述命令,那麼在go get下載包時候,會下載到GOPATH/src 目錄下。