1. 程式人生 > 其它 >搭建go環境和初始化專案

搭建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

關鍵環境變數:

GOROOTGo 的安裝目錄,即可執行檔案所在的目錄;

GOPATH工作目錄並不是專案所有目錄,編譯後的二進位制檔案存放地import 包的搜尋路徑,主要包含 bin

pkgsrc

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

  1. 下載Go外掛

然後點選右邊的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 目錄下