GO環境配置
歡迎來到Go的世界,讓我們開始探索吧!
Go是一種新的語言,一種並發的、帶垃圾回收的、快速編譯的語言。它具有以下特點:
- 它可以在一台計算機上用幾秒鍾的時間編譯一個大型的Go程序。
- Go為軟件構造提供了一種模型,它使依賴分析更加容易,且避免了大部分C風格include文件與庫的開頭。
- Go是靜態類型的語言,它的類型系統沒有層級。因此用戶不需要在定義類型之間的關系上花費時間,這樣感覺起來比典型的面向對象語言更輕量級。
- Go完全是垃圾回收型的語言,並為並發執行與通信提供了基本的支持。
- 按照其設計,Go打算為多核機器上系統軟件的構造提供一種方法。
Go是一種編譯型語言,它結合了解釋型語言的游刃有余,動態類型語言的開發效率,以及靜態類型的安全性。它也打算成為現代的,支持網絡與多核計算的語言。要滿足這些目標,需要解決一些語言上的問題:一個富有表達能力但輕量級的類型系統,並發與垃圾回收機制,嚴格的依賴規范等等。這些無法通過庫或工具解決好,因此Go也就應運而生了。
在本章中,我們將講述Go的安裝方法,以及如何配置項目信息。
1.1安裝Go
Go的三種安裝方式
- Go源碼安裝:這是一種標准的軟件安裝方式。對於經常使用Unix類系統的用戶,尤其對於開發者來說,從源碼安裝可以自己定制。
- Go標准包安裝:Go提供了方便的安裝包,支持Windows、Linux、Mac等系統。這種方式適合快速安裝,可根據自己的系統位數下載好相應的安裝包,一路next就可以輕松安裝了。推薦這種方式
- 第三方工具安裝:目前有很多方便的第三方軟件包工具,例如Ubuntu的apt-get和wget、Mac的homebrew等。這種安裝方式適合那些熟悉相應系統的用戶。
最后,如果你想在同一個系統中安裝多個版本的Go,你可以參考第三方工具GVM,這是目前在這方面做得最好的工具,除非你知道怎么處理。
Go源碼安裝
Go 1.5徹底移除C代碼,Runtime、Compiler、Linker均由Go編寫,實現自舉。只需要安裝了上一個版本,即可從源碼安裝。
在Go 1.5前,Go的源代碼中,有些部分是用Plan 9 C和AT&T匯編寫的,因此假如你要想從源碼安裝,就必須安裝C的編譯工具。
在Mac系統中,只要你安裝了Xcode,就已經包含了相應的編譯工具。
在類Unix系統中,需要安裝gcc等工具。例如Ubuntu系統可通過在終端中執行sudo apt-get install gcc libc6-dev來安裝編譯工具。
在Windows系統中,你需要安裝MinGW,然后通過MinGW安裝gcc,並設置相應的環境變量。
你可以直接去官網下載源碼,找相應的goVERSION.src.tar.gz的文件下載,下載之后解壓縮到$HOME目錄,執行如下代碼:
cd go/src
./all.bash
運行all.bash后出現"ALL TESTS PASSED"字樣時才算安裝成功。
上面是Unix風格的命令,Windows下的安裝方式類似,只不過是運行all.bat,調用的編譯器是 MinGW 的 gcc。
如果是Mac或者Unix用戶需要設置幾個環境變量,如果想重啟之后也能生效的話把下面的命令寫到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是寫入文件的,記得執行bash .bashrc或者bash .zshrc使得設置立馬生效。
如果是window系統,就需要設置環境變量,在path里面增加相應的go所在的目錄,設置gopath變量。
當你設置完畢之后在命令行里面輸入go,看到如下圖片即說明你已經安裝成功

圖1.1 源碼安裝之后執行Go命令的圖
如果出現Go的Usage信息,那么說明Go已經安裝成功了;如果出現該命令不存在,那么可以檢查一下自己的PATH環境變中是否包含了Go的安裝目錄。
從go 1.8開始,GOPATH環境變量現在有一個默認值,如果它沒有被設置。 它在Unix上默認為$HOME/go,在Windows上默認為%USERPROFILE%/go。
Go 標准包安裝
Go提供了每個平台打好包的一鍵安裝,這些包默認會安裝到如下目錄:/usr/local/go (Windows系統:c:\Go),當然你可以改變他們的安裝位置,但是改變之后你必須在你的環境變量中設置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面這些命令對於Mac和Unix用戶來說最好是寫入.bashrc或者.zshrc文件,對於windows用戶來說當然是寫入環境變量。
如何判斷自己的操作系統是32位還是64位?
我們接下來的Go安裝需要判斷操作系統的位數,所以這小節我們先確定自己的系統類型。
Windows系統用戶請按Win+R運行cmd,輸入systeminfo后回車,稍等片刻,會出現一些系統信息。在“系統類型”一行中,若顯示“x64-based PC”,即為64位系統;若顯示“X86-based PC”,則為32位系統。
Mac系統用戶建議直接使用64位的,因為Go所支持的Mac OS X版本已經不支持純32位處理器了。
Linux系統用戶可通過在Terminal中執行命令arch(即uname -m)來查看系統信息:
64位系統顯示
x86_64
32位系統顯示
i386
Mac 安裝
訪問下載地址,32位系統下載go1.4.2.darwin-386-osx10.8.pkg(更新的版本已無32位下載),64位系統下載go1.8.3.darwin-amd64.pkg,雙擊下載文件,一路默認安裝點擊下一步,這個時候go已經安裝到你的系統中,默認已經在PATH中增加了相應的~/go/bin,這個時候打開終端,輸入go
看到類似上面源碼安裝成功的圖片說明已經安裝成功
如果出現go的Usage信息,那么說明go已經安裝成功了;如果出現該命令不存在,那么可以檢查一下自己的PATH環境變中是否包含了go的安裝目錄。
Linux 安裝
訪問下載地址,32位系統下載go1.8.3.linux-386.tar.gz,64位系統下載go1.8.3.linux-amd64.tar.gz,
假定你想要安裝Go的目錄為 $GO_INSTALL_DIR,后面替換為相應的目錄路徑。
解壓縮tar.gz包到安裝目錄下:tar zxvf go1.8.3.linux-amd64.tar.gz -C $GO_INSTALL_DIR。
設置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin
然后執行go

圖1.2 Linux系統下安裝成功之后執行go顯示的信息
如果出現go的Usage信息,那么說明go已經安裝成功了;如果出現該命令不存在,那么可以檢查一下自己的PATH環境變中是否包含了go的安裝目錄。
Windows 安裝
訪問Golang 下載頁,32 位請選擇名稱中包含 windows-386 的 msi 安裝包,64 位請選擇名稱中包含 windows-amd64 的。下載好后運行,不要修改默認安裝目錄 C:\Go\,若安裝到其他位置會導致不能執行自己所編寫的 Go 代碼。安裝完成后默認會在環境變量 Path 后添加 Go 安裝目錄下的 bin 目錄 C:\Go\bin\,並添加環境變量 GOROOT,值為 Go 安裝根目錄 C:\Go\ 。
驗證是否安裝成功
在運行中輸入 cmd 打開命令行工具,在提示符下輸入 go,檢查是否能看到 Usage 信息。輸入 cd %GOROOT%,看是否能進入 Go 安裝目錄。若都成功,說明安裝成功。
不能的話請檢查上述環境變量 Path 和 GOROOT 的值。若不存在請卸載后重新安裝,存在請重啟計算機后重試以上步驟。
第三方安裝工具
GVM
gvm是第三方開發的Go多版本管理工具,類似ruby里面的rvm工具。使用起來相當的方便,安裝gvm使用如下命令:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
安裝完成后我們就可以安裝go了:
gvm install go1.8.3
gvm use go1.8.3
也可以使用下面的命令,省去每次調用gvm use的麻煩: gvm use go1.8.3 --default
執行完上面的命令之后GOPATH、GOROOT等環境變量會自動設置好,這樣就可以直接使用了。
apt-get
Ubuntu是目前使用最多的Linux桌面系統,使用apt-get命令來管理軟件包,我們可以通過下面的命令來安裝Go,為了以后方便,應該把 git mercurial 也安裝上:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable git-core mercurial
wget
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
sudo tar -xzf go1.8.3.linux-amd64.tar.gz -C /usr/local
配置環境變量:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=$HOME/gopath (可選設置)
或者使用:
sudo vim /etc/profile
並添加下面的內容:
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=$HOME/gopath (可選設置)
重新加載 profile 文件
source /etc/profile
homebrew
homebrew是Mac系統下面目前使用最多的管理軟件的工具,目前已支持Go,可以通過命令直接安裝Go,為了以后方便,應該把 git mercurial 也安裝上:
1.安裝homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2.安裝go
brew update && brew upgrade
brew install go
brew install git
brew install mercurial //可選安裝
1.2 GOPATH 與工作空間
前面我們在安裝Go的時候看到需要設置GOPATH變量,Go從1.1版本到1.7必須設置這個變量,而且不能和Go的安裝目錄一樣,這個目錄用來存放Go源碼,Go的可運行文件,以及相應的編譯之后的包文件。所以這個目錄下面有三個子目錄:src、bin、pkg
從go 1.8開始,GOPATH環境變量現在有一個默認值,如果它沒有被設置。 它在Unix上默認為$HOME/go,在Windows上默認
GOPATH 設置
go 命令依賴一個重要的環境變量:$GOPATH
Windows系統中環境變量的形式為%GOPATH%,本書主要使用Unix形式,Windows用戶請自行替換。
(注:這個不是Go安裝目錄。下面以筆者的工作目錄為示例,如果你想不一樣請把GOPATH替換成你的工作目錄。)
在類 Unix 環境下大概這樣設置:
export GOPATH=/home/apple/mygo
為了方便,應該新建以上文件夾,並且上一行加入到 .bashrc 或者 .zshrc 或者自己的 sh 的配置文件中。
Windows 設置如下,新建一個環境變量名稱叫做GOPATH:
GOPATH=c:\mygo
GOPATH允許多個目錄,當有多個目錄時,請注意分隔符,多個目錄的時候Windows是分號,Linux系統是冒號,當有多個GOPATH時,默認會將go get的內容放在第一個目錄下。
以上 $GOPATH 目錄約定有三個子目錄:
- src 存放源代碼(比如:.go .c .h .s等)
- pkg 編譯后生成的文件(比如:.a)
- bin 編譯后生成的可執行文件(為了方便,可以把此目錄加入到 $PATH 變量中,如果有多個gopath,那么使用${GOPATH//😕/bin:}/bin添加所有的bin目錄)
以后我所有的例子都是以mygo作為我的gopath目錄
代碼目錄結構規划
GOPATH下的src目錄就是接下來開發程序的主要目錄,所有的源碼都是放在這個目錄下面,那么一般我們的做法就是一個目錄一個項目,例如: $GOPATH/src/mymath 表示mymath這個應用包或者可執行應用,這個根據package是main還是其他來決定,main的話就是可執行應用,其他的話就是應用包,這個會在后續詳細介紹package。
所以當新建應用或者一個代碼包時都是在src目錄下新建一個文件夾,文件夾名稱一般是代碼包名稱,當然也允許多級目錄,例如在src下面新建了目錄$GOPATH/src/github.com/astaxie/beedb 那么這個包路徑就是"github.com/astaxie/beedb",包名稱是最后一個目錄beedb
下面我就以mymath為例來講述如何編寫應用包,執行如下代碼
cd $GOPATH/src
mkdir mymath
新建文件sqrt.go,內容如下
// $GOPATH/src/mymath/sqrt.go源碼如下:
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
這樣我的應用包目錄和代碼已經新建完畢,注意:一般建議package的名稱和目錄名保持一致
編譯應用
上面我們已經建立了自己的應用包,如何進行編譯安裝呢?有兩種方式可以進行安裝
-
只要進入對應的應用包目錄,然后執行
go install,就可以安裝了 -
在任意的目錄執行如下代碼
go install mymath
安裝完之后,我們可以進入如下目錄
cd $GOPATH/pkg/${GOOS}_${GOARCH}
//可以看到如下文件
mymath.a
這個.a文件是應用包,那么我們如何進行調用呢?
接下來我們新建一個應用程序來調用這個應用包
新建應用包mathapp
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
$GOPATH/src/mathapp/main.go源碼:
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
可以看到這個的package是main,import里面調用的包是mymath,這個就是相對於$GOPATH/src的路徑,如果是多級目錄,就在import里面引入多級目錄,如果你有多個GOPATH,也是一樣,Go會自動在多個$GOPATH/src中尋找。
如何編譯程序呢?進入該應用目錄,然后執行go build,那么在該目錄下面會生成一個mathapp的可執行文件
./mathapp
輸出如下內容
Hello, world. Sqrt(2) = 1.414213562373095
如何安裝該應用,進入該目錄執行go install,那么在$GOPATH/bin/下增加了一個可執行文件mathapp, 還記得前面我們把$GOPATH/bin加到我們的PATH里面了,這樣可以在命令行輸入如下命令就可以執行
mathapp
也是輸出如下內容
Hello, world. Sqrt(2) = 1.414213562373095
這里我們展示如何編譯和安裝一個可運行的應用,以及如何設計我們的目錄結構。
獲取遠程包
go語言有一個獲取遠程包的工具就是go get,目前go get支持多數開源社區(例如:GitHub、googlecode、bitbucket、Launchpad)
go get github.com/astaxie/beedb
go get -u 參數可以自動更新包,而且當go get的時候會自動獲取該包依賴的其他第三方包
通過這個命令可以獲取相應的源碼,對應的開源平台采用不同的源碼控制工具,例如GitHub采用git、googlecode采用hg,所以要想獲取這些源碼,必須先安裝相應的源碼控制工具
通過上面獲取的代碼在我們本地的源碼相應的代碼結構如下
$GOPATH
src
|--github.com
|-astaxie
|-beedb
pkg
|--相應平台
|-github.com
|--astaxie
|beedb.a
go get本質上可以理解為首先第一步是通過源碼工具clone代碼到src下面,然后執行go install
在代碼中如何使用遠程包,很簡單的就是和使用本地包一樣,只要在開頭import相應的路徑就可以
import "github.com/astaxie/beedb"
程序的整體結構
通過上面建立的我本地的mygo的目錄結構如下所示
bin/
mathapp
pkg/
平台名/ 如:darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
從上面的結構我們可以很清晰的看到,bin目錄下面存的是編譯之后可執行的文件,pkg下面存放的是應用包,src下面保存的是應用源代碼
1.3Go命令
Go語言自帶有一套完整的命令操作工具,你可以通過在命令行中執行go來查看它們:

圖1.3 Go命令顯示詳細的信息
這些命令對於我們平時編寫的代碼非常有用,接下來就讓我們了解一些常用的命令。
go build
這個命令主要用於編譯代碼。在包的編譯過程中,若有必要,會同時編譯與之相關聯的包。
-
如果是普通包,就像我們在
1.2節中編寫的mymath包那樣,當你執行go build之后,它不會產生任何文件。如果你需要在$GOPATH/pkg下生成相應的文件,那就得執行go install。 -
如果是
main包,當你執行go build之后,它就會在當前目錄下生成一個可執行文件。如果你需要在$GOPATH/bin下生成相應的文件,需要執行go install,或者使用go build -o 路徑/a.exe。 -
如果某個項目文件夾下有多個文件,而你只想編譯某個文件,就可在
go build之后加上文件名,例如go build a.go;go build命令默認會編譯當前目錄下的所有go文件。 -
你也可以指定編譯輸出的文件名。例如1.2節中的
mathapp應用,我們可以指定go build -o astaxie.exe,默認情況是你的package名(非main包),或者是第一個源文件的文件名(main包)。
實際上,package名在Go語言規范中指代碼中“package”后使用的名稱,此名稱可以與文件夾名不同。默認生成的可執行文件名是文件夾名。
-
go build會忽略目錄下以“_”或“.”開頭的go文件。
-
如果你的源代碼針對不同的操作系統需要不同的處理,那么你可以根據不同的操作系統后綴來命名文件。例如有一個讀取數組的程序,它對於不同的操作系統可能有如下幾個源文件:
array_linux.go array_darwin.go array_windows.go array_freebsd.go
go build的時候會選擇性地編譯以系統名結尾的文件(Linux、Darwin、Windows、Freebsd)。例如Linux系統下面編譯只會選擇array_linux.go文件,其它系統命名后綴文件全部忽略。
參數的介紹
-o指定輸出的文件名,可以帶上路徑,例如 go build -o a/b/c-i安裝相應的包,編譯+go install-a更新全部已經是最新的包的,但是對標准包不適用-n把需要執行的編譯命令打印出來,但是不執行,這樣就可以很容易的知道底層是如何運行的-p n指定可以並行可運行的編譯數目,默認是CPU數目-race開啟編譯的時候自動檢測數據競爭的情況,目前只支持64位的機器-v打印出來我們正在編譯的包名-work打印出來編譯時候的臨時文件夾名稱,並且如果已經存在的話就不要刪除-x打印出來執行的命令,其實就是和-n的結果類似,只是這個會執行-ccflags 'arg list'傳遞參數給5c, 6c, 8c 調用-compiler name指定相應的編譯器,gccgo還是gc-gccgoflags 'arg list'傳遞參數給gccgo編譯連接調用-gcflags 'arg list'傳遞參數給5g, 6g, 8g 調用-installsuffix suffix為了和默認的安裝包區別開來,采用這個前綴來重新安裝那些依賴的包,-race的時候默認已經是-installsuffix race,大家可以通過-n命令來驗證-ldflags 'flag list'傳遞參數給5l, 6l, 8l 調用-tags 'tag list'設置在編譯的時候可以適配的那些tag,詳細的tag限制參考里面的 Build Constraints
go clean
這個命令是用來移除當前源碼包和關聯源碼包里面編譯生成的文件。這些文件包括
_obj/ 舊的object目錄,由Makefiles遺留
_test/ 舊的test目錄,由Makefiles遺留
_testmain.go 舊的gotest文件,由Makefiles遺留
test.out 舊的test記錄,由Makefiles遺留
build.out 舊的test記錄,由Makefiles遺留
*.[568ao] object文件,由Makefiles遺留
DIR(.exe) 由go build產生
DIR.test(.exe) 由go test -c產生
MAINFILE(.exe) 由go build MAINFILE.go產生
*.so 由 SWIG 產生
我一般都是利用這個命令清除編譯文件,然后GitHub遞交源碼,在本機測試的時候這些編譯文件都是和系統相關的,但是對於源碼管理來說沒必要。
$ go clean -i -n
cd /Users/astaxie/develop/gopath/src/mathapp
rm -f mathapp mathapp.exe mathapp.test mathapp.test.exe app app.exe
rm -f /Users/astaxie/develop/gopath/bin/mathapp
參數介紹
-i清除關聯的安裝的包和可運行文件,也就是通過go install安裝的文件-n把需要執行的清除命令打印出來,但是不執行,這樣就可以很容易的知道底層是如何運行的-r循環的清除在import中引入的包-x打印出來執行的詳細命令,其實就是-n打印的執行版本
go fmt
有過C/C++經驗的讀者會知道,一些人經常為代碼采取K&R風格還是ANSI風格而爭論不休。在go中,代碼則有標准的風格。由於之前已經有的一些習慣或其它的原因我們常將代碼寫成ANSI風格或者其它更合適自己的格式,這將為人們在閱讀別人的代碼時添加不必要的負擔,所以go強制了代碼格式(比如左大括號必須放在行尾),不按照此格式的代碼將不能編譯通過,為了減少浪費在排版上的時間,go工具集中提供了一個go fmt命令 它可以幫你格式化你寫好的代碼文件,使你寫代碼的時候不需要關心格式,你只需要在寫完之后執行go fmt <文件名>.go,你的代碼就被修改成了標准格式,但是我平常很少用到這個命令,因為開發工具里面一般都帶了保存時候自動格式化功能,這個功能其實在底層就是調用了go fmt。接下來的一節我將講述兩個工具,這兩個工具都自帶了保存文件時自動化go fmt功能。
使用go fmt命令,其實是調用了gofmt,而且需要參數-w,否則格式化結果不會寫入文件。gofmt -w -l src,可以格式化整個項目。
所以go fmt是gofmt的上層一個包裝的命令,我們想要更多的個性化的格式化可以參考 gofmt
gofmt的參數介紹
-l顯示那些需要格式化的文件-w把改寫后的內容直接寫入到文件中,而不是作為結果打印到標准輸出。-r添加形如“a[b:len(a)] -> a[b:]”的重寫規則,方便我們做批量替換-s簡化文件中的代碼-d顯示格式化前后的diff而不是寫入文件,默認是false-e打印所有的語法錯誤到標准輸出。如果不使用此標記,則只會打印不同行的前10個錯誤。-cpuprofile支持調試模式,寫入相應的cpufile到指定的文件
go get
這個命令是用來動態獲取遠程代碼包的,目前支持的有BitBucket、GitHub、Google Code和Launchpad。這個命令在內部實際上分成了兩步操作:第一步是下載源碼包,第二步是執行go install。下載源碼包的go工具會自動根據不同的域名調用不同的源碼工具,對應關系如下:
BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)
所以為了go get 能正常工作,你必須確保安裝了合適的源碼管理工具,並同時把這些命令加入你的PATH中。其實go get支持自定義域名的功能,具體參見go help remote。
參數介紹:
-d只下載不安裝-f只有在你包含了-u參數的時候才有效,不讓-u去驗證import中的每一個都已經獲取了,這對於本地fork的包特別有用-fix在獲取源碼之后先運行fix,然后再去做其他的事情-t同時也下載需要為運行測試所需要的包-u強制使用網絡去更新包和它的依賴包-v顯示執行的命令
go install
這個命令在內部實際上分成了兩步操作:第一步是生成結果文件(可執行文件或者.a包),第二步會把編譯好的結果移到$GOPATH/pkg或者$GOPATH/bin。
參數支持go build的編譯參數。大家只要記住一個參數-v就好了,這個隨時隨地的可以查看底層的執行信息。
go test
執行這個命令,會自動讀取源碼目錄下面名為*_test.go的文件,生成並運行測試用的可執行文件。輸出的信息類似
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...
默認的情況下,不需要任何的參數,它會自動把你源碼包下面所有test文件測試完畢,當然你也可以帶上參數,詳情請參考go help testflag
這里我介紹幾個我們常用的參數:
-bench regexp執行相應的benchmarks,例如 -bench=.-cover開啟測試覆蓋率-run regexp只運行regexp匹配的函數,例如 -run=Array 那么就執行包含有Array開頭的函數-v顯示測試的詳細命令
go tool
go tool下面下載聚集了很多命令,這里我們只介紹兩個,fix和vet
go tool fix. 用來修復以前老版本的代碼到新版本,例如go1之前老版本的代碼轉化到go1,例如API的變化go tool vet directory|files用來分析當前目錄的代碼是否都是正確的代碼,例如是不是調用fmt.Printf里面的參數不正確,例如函數里面提前return了然后出現了無用代碼之類的。
go generate
這個命令是從Go1.4開始才設計的,用於在編譯前自動化生成某類代碼。go generate和go build是完全不一樣的命令,通過分析源碼中特殊的注釋,然后執行相應的命令。這些命令都是很明確的,沒有任何的依賴在里面。而且大家在用這個之前心里面一定要有一個理念,這個go generate是給你用的,不是給使用你這個包的人用的,是方便你來生成一些代碼的。
這里我們來舉一個簡單的例子,例如我們經常會使用yacc來生成代碼,那么我們常用這樣的命令:
go tool yacc -o gopher.go -p parser gopher.y
-o 指定了輸出的文件名, -p指定了package的名稱,這是一個單獨的命令,如果我們想讓go generate來觸發這個命令,那么就可以在當前目錄的任意一個xxx.go文件里面的任意位置增加一行如下的注釋:
//go:generate go tool yacc -o gopher.go -p parser gopher.y
這里我們注意了,//go:generate是沒有任何空格的,這其實就是一個固定的格式,在掃描源碼文件的時候就是根據這個來判斷的。
所以我們可以通過如下的命令來生成,編譯,測試。如果gopher.y文件有修改,那么就重新執行go generate重新生成文件就好。
$ go generate
$ go build
$ go test
godoc
在Go1.2版本之前還支持go doc命令,但是之后全部移到了godoc這個命令下,需要這樣安裝go get golang.org/x/tools/cmd/godoc
很多人說go不需要任何的第三方文檔,例如chm手冊之類的(其實我已經做了一個了,chm手冊),因為它內部就有一個很強大的文檔工具。
如何查看相應package的文檔呢? 例如builtin包,那么執行godoc builtin 如果是http包,那么執行godoc net/http 查看某一個包里面的函數,那么執行godoc fmt Printf 也可以查看相應的代碼,執行godoc -src fmt Printf
通過命令在命令行執行 godoc -http=:端口號 比如godoc -http=:8080。然后在瀏覽器中打開127.0.0.1:8080,你將會看到一個golang.org的本地copy版本,通過它你可以查詢pkg文檔等其它內容。如果你設置了GOPATH,在pkg分類下,不但會列出標准包的文檔,還會列出你本地GOPATH中所有項目的相關文檔,這對於經常被牆的用戶來說是一個不錯的選擇。
其它命令
go還提供了其它很多的工具,例如下面的這些工具
go version 查看go當前的版本
go env 查看當前go的環境變量
go list 列出當前全部安裝的package
go run 編譯並運行Go程序
以上這些工具還有很多參數沒有一一介紹,用戶可以使用go help 命令獲取更詳細的幫助信息。
1.4 Go開發工具
本節我將介紹幾個開發工具,它們都具有自動化提示,自動化fmt功能。因為它們都是跨平台的,所以安裝步驟之類的都是通用的。
LiteIDE
LiteIDE是一款專門為Go語言開發的跨平台輕量級集成開發環境(IDE),由visualfc編寫。
LiteIDE安裝配置
-
LiteIDE安裝
首先安裝好Go語言環境,然后根據操作系統下載LiteIDE對應的壓縮文件直接解壓即可使用。
-
編譯環境設置
根據自身系統要求切換和配置LiteIDE當前使用的環境變量。
以Windows操作系統,64位Go語言為例, 工具欄的環境配置中選擇win64,點編輯環境,進入LiteIDE編輯win64.env文件
GOROOT=c:\go
GOBIN=
GOARCH=amd64
GOOS=windows
CGO_ENABLED=1
PATH=%GOBIN%;%GOROOT%\bin;%PATH%
。。。
將其中的GOROOT=c:\go修改為當前Go安裝路徑,存盤即可,如果有MinGW64,可以將c:\MinGW64\bin加入PATH中以便go調用gcc支持CGO編譯。
以Linux操作系統,64位Go語言為例, 工具欄的環境配置中選擇linux64,點編輯環境,進入LiteIDE編輯linux64.env文件
GOROOT=$HOME/go
GOBIN=
GOARCH=amd64
GOOS=linux
CGO_ENABLED=1
PATH=$GOBIN:$GOROOT/bin:$PATH
。。。
將其中的GOROOT=$HOME/go修改為當前Go安裝路徑,存盤即可。
- GOPATH設置
Go語言的工具鏈使用GOPATH設置,是Go語言開發的項目路徑列表,在命令行中輸入(在LiteIDE中也可以Ctrl+,直接輸入)go help gopath快速查看GOPATH文檔。
在LiteIDE中可以方便的查看和設置GOPATH。通過菜單-查看-GOPATH設置,可以查看系統中已存在的GOPATH列表, 同時可根據需要添加項目目錄到自定義GOPATH列表中。
Visual Studio Code
vscode是微軟基於Electron和web技術構建的開源編輯器, 是一款很強大的編輯器。開源地址:https://github.com/Microsoft/vscode
1、安裝Visual Studio Code 最新版
官方網站:https://code.visualstudio.com/ 下載Visual Studio Code 最新版,安裝過程略。
2、安裝Go插件
點擊右邊的 Extensions 圖標 搜索Go插件 在插件列表中,選擇 Go,進行安裝,安裝之后,系統會提示重啟 Visual Studio Code。
建議把自動保存功能開啟。開啟方法為:選擇菜單 File,點擊 Auto save。
vscode代碼設置可用於Go擴展。這些都可以在用戶的喜好來設置或工作區設置(.vscode/settings.json)。
這個 .vscode 是在 GOPATH 下創建
其他常用插件 vscode-icons Chinese
打開首選項-用戶設置 settings.json:
{
"go.buildOnSave": true,
"go.lintOnSave": true,
"go.vetOnSave": true,
"go.buildFlags": [],
"go.lintFlags": [],
"go.vetFlags": [],
"go.coverOnSave": false,
"go.useCodeSnippetsOnFunctionSuggest": false,
"go.formatOnSave": true,
//goimports
"go.formatTool": "goreturns",
"go.goroot": "",//你的Goroot
"go.gopath": "",//你的Gopath
}
接着安裝依賴包支持(網絡不穩定,請直接到 GitHub Golang 下載再移動到相關目錄):
在安裝這些包之前,首先在 src 中創建一個 hello.go 文件。用 vscode 打開,vscode 就會提示安裝這些文件。
因為國內網絡的問題。我們可以采用由 go 的愛好者共同維護的包代理中心,作為轉接。
操作方法地址點此
最后用vscode 打開文件夾的方式,打開 GOPATH 外的文件夾。然后在這個外部的文件夾,比如
D:\code\gocode 中創建一個 hello.go, 來運行這個文件即可。當然這些需要你在 終端中,進入 gocode 目錄下, go mod init 一下。
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...
vscode 還有一項很強大的功能就是斷點調試,結合 delve 可以很好的進行 Go 代碼調試
go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv
brew install go-delve/delve/delve(mac可選)
如果有問題再來一遍:
go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv
注意:修改"dlv-cert"證書, 選擇"顯示簡介"->"信任"->"代碼簽名" 修改為: 始終信任
打開首選項-工作區設置,配置launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "main.go",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceRoot}",//工作空間路徑
"env": {},
"args": [],
"showLog": true
}
]
}
