go有兩套編譯工具鏈,分別是從plant9移植過來的gc和依賴gcc的gccgo。linux
官方爲gc工具鏈提供了二進制安裝包和源碼, 能夠根據須要選擇一種安裝方式。gc工具鏈對操做系統和CPU類型的支持狀況以下:android
操做系統 | CPU類型 | 備註 |
---|---|---|
FreeBSD 8 or later | amd64, 386, arm | Debian GNU/kFreeBSD not supported; FreeBSD/ARM needs FreeBSD 10 or later |
Linux 2.6.23 or later with glibc | amd64, 386, arm | CentOS/RHEL 5.x not supported; no binary distribution for ARM yet |
Mac OS X 10.6 or later | amd64, 386 | use the gcc** that comes with Xcode** |
Windows XP or later | amd64, 386 | use MinGW gcc. No need for cygwin or msys. |
對於其它操做系統或CPU類型,須要從源碼編譯gc工具鏈或使用gccgo。git
解壓到/usr/local
目錄:github
$ tar -C /usr/local -xzf go$VERSION.$GOOS-$GOARCH.tar.gz
將/usr/local/go/bin添加到PATH中:golang
$ export PATH=$PATH:/usr/local/go/bin
go默認假設被安裝到/usr/loca/go,若是被安裝到其它位置,則須要設置GOROOT環境變量。例如,二進制包被解壓到$HOME目錄,則設置以下:bootstrap
$ export GOROOT=$HOME/go $ export PATH=$PATH:$GOROOT/bin
注意:只有當將go安裝到非/usr/local目錄時才須要設置GOROOT變量。windows
1.4版本後的Go工具鏈是用go語言寫的,若是要構建它,系統須要安裝Go編譯器:api
若是系統已經有>= 1.4版本的go工具鏈,則將GOROOT_BOOTSTRAP
變量設置爲所在目錄;bash
$ unset GOROOT GOPATH #若是系統已經有go工具鏈,須要清除`$GOPATH`和`$GOROOT`變量; $ export GOROOT_BOOTSTRAP=$HOME/local/go
不然,須要下載1.4版本的go工具鏈,該版本是C寫的,只依賴gcc和glibc;能夠下載二進制或編譯並安裝源碼,而後將GOROOT_BOOTSTRAP
變量設置爲所在目錄;架構
$ cd /tmp $ git clone git@github.com:golang/go.git $ cd go $ git checkout -b 1.4.3 go1.4.3 $ cd src $ ./all.bash #編譯go 1.4.3 $ export GOROOT_BOOTSTRAP=/tmp/go/go #GOROOT\_BOOTSTRAP缺省值爲`$HOME/go1.4`,若是安裝到其它位置,則須要從新定義;
使用GOROOT_BOOTSTRAP變量指定Go工具鏈位置(若是位於$HOME/go1.4,則無需指定)後,能夠執行源碼中的bootstrap.bash
腳本,生成支持$GOOS
、$GOARCH
指定的目標操做系統和架構的新工具鏈:
$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash
該命令生成的工具鏈位於../../go-${GOOS}-${GOARCH}-bootstrap.
目錄,能夠設置爲變量GOROOT_BOOTSTRAP
的值,用於後續編譯源碼;
設置git代理:
$ git config http.proxy http://user:passwd@host:port
$ git config https.proxy https://user:passwd@host:port
設置go get代理
$ export http_proxy=http://user:passwd@host:port
獲取源代碼:
直接下載或者從git倉庫clone。
從官網下載
$ wget https://golang.org/dl/go$VERSION.src.tar.gz $ tar -xzvf go$VERSION.$OS-$ARCH.tar.gz
從git代碼庫clone:
$ git clone https://go.googlesource.com/go #需FQ $ git clone https://github.com/golang/go.git $ cd go $ git checkout go1.6 #也能夠切換到其它分支如master
編譯源代碼
$ pwd /tmp/ $ cd go/src $ ./all.bash #使用`GOROOT_BOOTSTRAP`指定的go 1.4版本以上的工具鏈來編譯go源碼 ... ALL TESTS PASSED --- Installed Go for linux/amd64 in /tmp/go Installed commands in /tmp/go/bin *** You need to add /tmp/go/bin to your PATH.
go 會將安裝位置記錄到二進制的GOROOT
變量中,若是須要調整安裝目錄,能夠設置$GOROOT_FINAL=/path/to/goTree
, 這樣編譯完後會提示將/tmp/go
移動到/path/to/goTree
目錄(這個參數只能在編譯階段有效,若是在編譯後移動Go tree則參考步驟5)。
$ ls /tmp/go -F
api/ AUTHORS bin/ CONTRIBUTORS doc/ favicon.ico include/ lib/
LICENSE misc/ PATENTS pkg/ README robots.txt src/ test/ VERSION $ ls /tmp/go/bin #源碼包自帶的二進制工具命令, 沒有 godoc go gofmt $ ls /tmp/go/pkg/tool/linux_amd64/ addr2line asm cgo compile dist doc fix link nm objdump pack pprof tour yacc $ /tmp/go/bin/go env |grep -E 'GOROOT|GOTOOLDIR' GOROOT="/tmp/go" #可見Go tree被安裝到預期位置 GOTOOLDIR="/tmp/go/pkg/tool/linux_amd64"
將/tmp/go/bin
加入到PATH中,便可使用。
移動 Go 源碼目錄
能夠將編譯過的Go Tree移動到其它目錄,而後修改GOROOT
環境變量便可。
$ mkdir /tmp/xxx
$ export GOROOT=/tmp/xxx $ mv * /tmp/xxx $ /tmp/xxx/bin/go env |grep -E 'GOROOT|GOTOOLDIR' GOROOT="/tmp/xxx" #Go tree和工具鏈自動調整 GOTOOLDIR="/tmp/xxx/pkg/tool/linux_amd64" #設置PATH和GOPATH $ export PATH=/tmp/xxx/bin:$PATH $ which go /tmp/xxx/bin/go $ go version go version go1.4 linux/amd64
安裝額外的工具如godoc
, vet
, cover
(二進制發佈版中包含這些工具,無需額外安裝):
一些Go工具位於go.tools倉庫中,須要額外安裝。
$ #安裝全部工具: $ go get golang.org/x/tools/cmd/... #...是通配符,參考: go help packages $ go get golang.org/x/tools/cmd/godoc #只安裝godoc工具 $ ls bin/ #多了godoc go godoc gofmt $ ls pkg/tool/linux_amd64/ #多了vet,cover addr2line asm cgo compile cover dist doc fix link nm objdump pack pprof tour trace vet yacc
go 命令會將godoc
安裝到$GOROOT/bin
或者$GOBIN
,其它的go tool
如cover
、vet
安裝到$GOROOT/pkg/tool/$GOOS_$GOARCH
。能夠用go tool cover
或go tool vet
命令來調用後面目錄中的程序。
建立和設置GOPATH(非必須):
$ mkdir -p $HOME/go/{src,bin,pkg} $ export GOPATH=$HOME/go $ mkdir $HOME/go/src/demo $ cd !$
編寫一個測試文件如 hello.go
package main
import "fmt"
func main() { fmt.Printf("hello, world\n") }
編譯並執行, -x選項能夠打印出編譯過程
$ go build -x demo.go
WORK=/tmp/go-build333633893 mkdir -p $WORK/command-line-arguments/_obj/ mkdir -p $WORK/command-line-arguments/_obj/exe/ cd /home/ksyun/golang/src /home/ksyun/local/go/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -p main -complete -buildid ed5feda32ea5b5ab51ac7fe9d1193005f6f99836 -D _/home/ksyun/golang/src -I $WORK -pack ./demo.go cd . /home/ksyun/local/go/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/a.out -L $WORK -extld=gcc -buildmode=exe -buildid=ed5feda32ea5b5ab51ac7fe9d1193005f6f99836 $WORK/command-line-arguments.a mv $WORK/command-line-arguments/_obj/exe/a.out demo hello, world
編譯工具鏈能夠使用如下環境變量進行配置;
$GOROOT
構建時,值爲all.bash
腳本所在目錄的父目錄,會被寫入到生成的二進制中;若是後續移動了安裝目錄,則使用該變量指定新的Go Tree頂層目錄;
$GOROOT_FINAL
通常和$GOROOT
一致,定義在構建後的安裝階段安裝到的位置;
$GOOS
和$GOARCH
交叉編譯時,分別定義目標操做系統和體系結構,默認和$GOHOSTOS
和$GOHOSTARCH
一致。各組合以下:
$GOOS $GOARCH android arm darwin 386 darwin amd64 darwin arm darwin arm64 dragonfly amd64 freebsd 386 freebsd amd64 freebsd arm linux 386 linux amd64 linux arm linux arm64 linux ppc64 linux ppc64le linux mips64 linux mips64le netbsd 386 netbsd amd64 netbsd arm openbsd 386 openbsd amd64 openbsd arm plan9 386 plan9 amd64 solaris amd64 windows 386 windows amd64
$ #交叉編譯 $ GOOS=windows GOARCH=amd64 go build $ file pssh.exe pssh.exe: PE32+ executable for MS Windows (console) Mono/.Net assembly
$GOHOSTOS
和$GOHOSTARCH
編譯工具鏈所在主機的操做系統和架構類型,必須與所在操做系統和CPU架構類型兼容;
$GOBIN
若是設置,則全部的Go二進制程序將安裝到此目錄,而不是默認的$GOPATH/bin