鑑於愈來愈多的開源項目都採用Go爲開發語言,本文介紹Linux(CentOS 6.8)下GO開發環境的搭建與使用。html
1、Go安裝使用linux
一、下載Go源碼包git
https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
上傳到/usr/local/src目錄下程序員
二、編譯安裝Go到/usr/localgithub
tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/
#注:必須使用root帳戶或者使用sudo來解壓縮Go源碼包golang
三、設置PATH環境變量,添加/usr/local/go/bin到環境變量編程
export PATH=$PATH:/usr/local/go/bin
四、安裝到自定義位置api
Go二進制文件默認安裝到/usr/local/go,可是能夠安裝Go工具到不一樣的位置,能夠自行定義,只須要設置正確的環境變量。架構
例如,安裝Go到家目錄下,必須添加環境變量到$HOME/.profile框架
export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin
注:安裝Go到其餘目錄時,GOROOT必須設置爲環境變量
五、檢查是否正確安裝程序
經過設置一個工做區和創建一個簡單的程序,檢查是否正確安裝了一個簡單的程序。建立一個目錄包含您的工做空間,例如/data/work,並設置GOPATH環境變量指向的位置。
export GOPATH=/data/work
#若是不存在/data/work,須要新建
而後,在你的工做內建立src/github.com/user/hello,若是使用github,可使用本身的用戶名代替user,在hello目錄下,新建hello.go
# cat hello.go package main import "fmt" func main { fmt.Printf("hello,world!\n") }
#使用go編譯hello.go
go install github.com/user/hello
#上面的命令講名叫hello(or hello.exe)的程序放到你的工做區內,執行下面命令,會獲得輸出結果。
$GOPATH/bin/hello hello,world!
#當出現hello,world!代表Go已經安裝成功能夠工做。
2、Go工做區介紹
一、機構組織代碼概述
Go語言程序一般將全部的代碼保存在一個工做區中。
工做區包含許多版本控制庫(由Git管理)。
每一個存儲庫包含一個或多個包。
每一個包由一個或多個在一個目錄中的源文件組成。
一個包的目錄的路徑決定其導入路徑。
注:同於其餘的編程環境中,每個項目都有一個獨立的工做區且工做區是緊密聯繫在一塊兒的版本控制庫。
二、工做區介紹
工做區是一個目錄層次結構,它的根目錄有三個目錄:
src 包含Go源文件
pkg 包含對象和包
bin 包含可執行命令
Go工具建立源碼包並安裝二進制文件到pkg和bin目錄下
src目錄一般包含多個版本控制庫(如Git或Mercurial),跟蹤一個或多個源包的開發。
下面展現一個好的工做區的例子:
bin/ hello # command executable outyet # command executable pkg/ linux_amd64/ github.com/golang/example/ stringutil.a # package object src/ github.com/golang/example/ .git/ # Git repository metadata hello/ hello.go # command source outyet/ main.go # command source main_test.go # test source stringutil/ reverse.go # package source reverse_test.go # test source golang.org/x/image/ .git/ # Git repository metadata bmp/ reader.go # package source writer.go # package source ... (many more repositories and packages omitted) ...
上面的屬性圖展現了一個包含兩個存儲庫(example和image)的工做區,example 存儲庫包含兩個命令(hello,outyet),image庫包含bmp包和幾個其餘的包。
一個典型的工做區包含包含許多軟件包和命令的多個源庫。大多數程序員將全部的源代碼和依賴關係保存在一個工做區中
三、GOPATH環境變量設置
GOPATH環境變量指定工做區的位置。它極可能是惟一的環境變量,代碼開發時須要設置。
開始,建立一個工做區目錄並設置相應的gopath。您的工做區能夠位於任何你喜歡的地方,但咱們將在這個文檔中使用/data/work。請注意,這不能是您的「Go安裝」路徑相同。
mkdir -p /data/work export GOPATH=/data/work
爲了方便。添加工做區的bin到PATH中
export PATH=$PATH:$GOPATH/bin
四、導入路徑
一個導入路徑是惟一標識一個包的字符串。一個包的導入路徑對應於它在工做區內或遠程存儲庫中的位置。
從標準庫的軟件包中給出了短的導入路徑等。對於您本身的包,您必須選擇不可能和將來添加到標準庫或其餘外部庫的基礎路徑衝突的路徑。
注意,你不須要將你的代碼發佈到一個遠程存儲庫以前,你能夠創建它。這只是一個很好的習慣來組織你的代碼,若是你有一天會出版它。在實踐中,你能夠選擇任何任意的路徑名稱,只要它是惟一的標準庫和更大的去生態系統。
咱們將使用github.com/user做爲咱們的基本路徑。在您的工做區中建立一個目錄,以保持源代碼:
mkdir -p $GOPATH/src/github.com/user
五、第一個項目
編譯並運行一個簡單的程序,首先選擇一個包的路徑(咱們將使用github.com/user/hello)和建立在您的工做區相應的軟件包目錄:
mkdir $GOPATH/src/github.com/user/hello
建立名叫hello.go的文件,上面建立過,此處略過。
cd $GOPATH/src/github.com/user/hello go install $GOPATH/bin/hello
或者:
hello
若是你使用的是一個源代碼管理系統,如今是一個很好的時間來初始化一個存儲庫,添加文件,並提交你的第一次更改。再次,這一步是可選的:您不須要使用源代碼管理來寫代碼。
cd $GOPATH/src/github.com/user/hello git init Initialized empty Git repository in /data/work/src/github.com/user/hello/.git/ git add hello.go git commit -m "first commit" [master (root-commit) bbfb477] first commit
六、first library
mkdir $GOPATH/src/github.com/user/stringutil
下一步,在目錄下建立一個名爲reverse.go文件中有下列內容:
// Package stringutil contains utility functions for working with strings. package stringutil // Reverse returns its argument string reversed rune-wise left to right. func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) }
使用go build測試包的編譯
$ go build github.com/user/stringutil
若是當前位置源碼包目錄,只須要:
go build
上面操做並不會產生一個輸出文件,必須使用go install,把包和對象輸出到工做去的pkg目錄內
確認stringutil包建立完成後,修改原始hello.go,使用stringutil包:
package main import ( "fmt" "github.com/user/stringutil" ) func main() { fmt.Printf(stringutil.Reverse("\n !oG ,olleH")) }
不管使用go安裝包仍是二進制文件,全部相關的依賴都會自動安裝。因此當你安裝hello程序時:
$ go install github.com/user/hello
對應的stringutil包會自動安裝好。
執行新的hello程序,能夠看到消息已經被反轉
# hello Hello, Go!
完成上面操做以後,工做區應該爲:
├── bin │ └── hello # command executable ├── pkg │ └── linux_amd64 # this will reflect your OS and architecture │ └── github.com │ └── user │ └── stringutil.a # package object └── src └── github.com └── user ├── hello │ └── hello.go # command source └── stringutil └── reverse.go # package source
注意:go install會把庫文件stringutil.a放到pkg/linux_amd64下邊(目錄結構跟源代碼結構同樣)。這樣能夠go命令能夠直接找到對應的包對象,避免沒必要要的重複編譯。linux_amd64是爲了根據操做系統和你的系統架構交叉編譯。
全部Go可執行程序都經過靜態方式連接在一塊兒,因此在運行時是不須要相關的包對象(庫)。
七、包命令
全部的Go源代碼都如下面的語句開始:
package name
其中name就是包引用默認的名稱,一個包中的全部文件必須使用同一個包名,可執行命令必須是main。
一個二進制文件下全部的包名不須要惟一,可是引用路徑必須惟一
八、測試
Go自帶了一個輕量級的測試框架,由go test和testing包組成。
能夠經過新建xx_test.go寫一個測試,其中包含若干個TestXXX函數。測試框架會自動執行這些函數;若是函數中包含tError或t.Fail, 對應的測試會被判爲失敗。
添加一個針對stringutil的測試文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含如下內容:
package stringutil import "testing" func TestReverse(t *testing.T) { cases := []struct { in, want string }{ {"Hello, world", "dlrow ,olleH"}, {"Hello, 世界", "界世,olleH"}, {"", ""}, } for _, c := range cases { got := Reverse(c.in) if got != c.want { t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) } } }
#經過go test測試
# go test github.com/user/stringutil ok github.com/user/stringutil 0.002s
#一樣的,在包文件夾下能夠忽略路徑而直接執行go test
[root@zabbix stringutil]# go test PASS ok github.com/user/stringutil 0.002s
九、遠程包
包的引用路徑用來描述如何經過版本控制系統獲取包的源代碼。go工具經過引用路徑自動從遠程代碼倉庫獲取包文件。好比本文中用的例子也對應的保存在github.com/golang/example下。go能夠經過包的代碼倉庫的url直接獲取、生成、安裝對應的包。
[root@zabbix ~]# go get github.com/golang/example/hello [root@zabbix ~]# $GOPATH/bin/hello Hello, Go examples!
若是工做區中不存在對應的包,go會將對應的包放到GOPATH環境變量指明的工做區下。(若是包已經存在,go跳過代碼拉去而直接執行go install)
執行上邊的go get命令後,工做空間文件夾下是這樣的結果:
github上的hello命令依賴於同個倉庫下的stringutil庫,hello.go使用一樣的路徑進行導入,因此go get命令可以直接找到並安裝對應的依賴包。
import "github.com/golang/example/stringutil"
#經過這種方式共享Go包最好。
本文地址:http://www.linuxprobe.com/set-go-env.html