Go的安裝
補充說明:由於VS Code對go mod模式的支持暫時還不夠完善,建議大家使用Goland編輯器。
不管是Windows還是MacOS都是非常簡單快捷,將安裝包下載好后直接一步到位next即可(也可以使用goland直接安裝)
Linux下的安裝,就是將下載的Linux安裝包中的go
文件夾,解壓到/usr/local
路徑即可
在控制台輸入go version
,如果顯示了版本號,即代表安裝成功
Go環境變量的配置
安裝成功后,環境變量的配置也沒有以前那么麻煩
僅需要幾步操作即可
1、設置GOROOT和GOPATH路徑(GOPATH路徑是我們的工作區)
go env -w GOPATH=我們自己的工作區路徑
例如我的就設為 /Users/naonao/go
2、開啟go module,配置goproxy
$ go env -w GO111MODULE=on // Windows
$ export GO111MODULE=on // macOS 或 Linux
阿里配置:
$ go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ // Windows
$ export GOPROXY=https://mirrors.aliyun.com/goproxy/ // macOS 或 Linux
七牛雲配置:
$ go env -w GOPROXY=https://goproxy.cn // Windows
$ export GOPROXY=https://goproxy.cn // macOS 或 Linux
3、重要的環境變量
Go
通過環境變量來做項目上的管理和控制,通過命令 go env
可以查看相關變量:
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
:下載依賴時的代理,必須配置,不然無法成功下載;
初始化項目
# 創建project的目錄
$ mkdir gproject
# 進入目錄
$ cd gproject/
# 初始化
E:\go>go mod init gproject
go: creating new go.mod: module gproject
在該目錄中創建一個main.go
文件:
package main // 聲明 main 包,表明當前是一個可執行程序
import "fmt" // 導入內置 fmt 包
func main(){ // main函數,是程序執行的入口
fmt.Println("Hello World!") // 在終端打印 Hello World!
}
執行或編譯后執行:
# 直接run
$ go run main.go
# 編譯成二進制文件
$ go build
# 執行二進制文件
goland使用go mod模式
第一步:創建空文件夾
第二步:goland以項目方式打開文件夾
第三步:設置goland中的配置,gopath,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都需要提交的代碼庫,
這樣別人獲取項目代碼並編譯時 就會使用項目所要求的以來版本。
本地保存使用包,命令
go mod vendor
執行該命令后,會出現一個vendor文件夾,里面就是你引用的所有包,由此就可以看出,使用mod后,已經不用依賴於原始的gopath,靈活性更高了。
如果使用過程中有包的變動等,可以使用其他命令輔助,比如go mod tidy,整理你的包目錄。
go mod 的指令
go.mod文件中通過指令聲明module信息,用於控制命令行工具進行版本選擇。一共有四個指令可供使用:
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環境
VSCodede的安裝
推薦VSCode官網下載,下載地址。
安裝步驟也是一路next,路徑選擇根據個人。
VSCode的配置
- 下載Go插件
然后點擊右邊的Install即可(我的是已經安裝過的所以這樣顯示)
2. 創建一個項目(文件夾)然后打開他(左上角的File -> Open Folder)
3. 然后點擊下方的TERMINAL,輸入命令go mod init 你的項目名稱,執行該命令后,執行的目錄下面就會出現一個go.mod文件
4. 新建一個Go文件, VSCode會激活Go插件,提示的工具全部安裝就行了
5. 然后繼續在TERMINAL中手動執行go文件,輸入指令go run 文件名
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 目錄下。
go install
go install
表示安裝的意思,它先編譯源代碼得到可執行文件,然后將可執行文件移動到GOPATH
的bin目錄下。因為我們的環境變量中配置了GOPATH
下的bin目錄,所以我們就可以在任意地方直接執行可執行文件了。
跨平台編譯
默認我們go build
的可執行文件都是當前操作系統可執行的文件,如果我想在windows下編譯一個linux下可執行文件,那需要怎么做呢?
只需要指定目標操作系統的平台和處理器架構即可:
SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目標平台是linux
SET GOARCH=amd64 // 目標處理器架構是amd64
使用了cgo的代碼是不支持跨平台編譯的
然后再執行go build
命令,得到的就是能夠在Linux平台運行的可執行文件了。
Mac 下編譯 Linux 和 Windows平台 64位 可執行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下編譯 Mac 和 Windows 平台64位可執行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下編譯Mac平台64位可執行程序:
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也沒好使。
最后把系統注銷重新登錄了一下好使了