GO環境goland及初始化項目(二)


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

關鍵環境變量:

GOROOTGo 的安裝目錄,即可執行文件所在的目錄;

GOPATH工作目錄並不是項目所有目錄,編譯后的二進制文件存放地import 包的搜索路徑,主要包含 binpkgsrc

GO111MODULE :啟用 go module 管理項目,需要有 go.modgo.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的配置

  1. 下載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也沒好使。

最后把系統注銷重新登錄了一下好使了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM