用Goland在調試go-ethereum源碼時遇到一些問題,在大神的指導下把Goland給搞定了,在此整理一下,希望能協助到初學者。
在學習golang時,把書本上的代碼敲一遍跑一邊沒問題,因為都是單個檔案運行。但是真正用go去跑項目時就出問題了,因此要從根本上理解問題。
MinGW
在對項目進行編譯時間,發生報錯:
編譯報錯因此重新下載安裝了MinGW,安裝完成後設定Path,運行
gcc- v
,能列印版本表示已安裝成功。
GOROOT和GOPATH
GOROOT 的目的是設定go的安裝位置,編譯時間從GOROOT去找SDK的system library。如果不設定,會從預設位置擷取。
GOPATH 的目的是設定代碼路徑 ,需要代碼時從該路徑尋找。此處程式碼封裝括了 本項目代碼 和 引用外部項目的 依賴包 代碼。GOPATH
可以隨著項目的不同而重新設定。
GOPATH 必須 有以下三個目錄:
- src:存放原始碼的目錄,比如
.go
,.h
,.c
。
- pkg:編譯後產生的檔案,比如
.a
檔案,go install
後會在該目錄產生一個 .a
檔案。
- bin:編譯後產生的可執行檔。
Go編譯時間會從$GOPATH/src
目錄尋找需要的代碼。
當項目需要依賴外部依賴包,go直接通過GOPATH
進行管理。go允許import
不同程式碼程式庫的代碼,比如 github.com
,對於需要 import
的代碼,可以使用 go get
命令取下來存放到GOPATH對應的目錄中去,比如 $GOPATH/src/github.com
下。
因此,對於go來說,並不關心代碼是內部的還是外部的,都是從GOPATH
擷取,任何需要import
的包路徑都從GOPATH
開始。唯一的區別就是,內部依賴的包是項目開發人員自己寫的,外部依賴包是通過 go get
下來的。
Vendor
vendor
屬性讓go編譯時間,優先從項目源碼樹根目錄下的vendor目錄尋找代碼(可以理解為切換了一次GOPATH
),如果vendor
中有,則不再去GOPATH中找。
因此,要把項目所有的依賴包都拷貝到vendor
目錄。使用包版本管理工具來處理這些事情,go官方的 dep
以及非官方的 glide
等。