這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
| 導讀 |
Go語言是Google2009發布的第二款開源程式設計語言,Go語言專門針對多處理器系統應用程式的編程進行了最佳化,使用Go編譯的程式可以媲美C或C++代碼的速度,而且更加安全、支援並行進程。 |
鑒於原來越多的開源項目都採用Go為開發語言,本文介紹Linux(CentOS 6.8)下GO開發環境的搭建與使用。
一、Go安裝使用
1、下載Go源碼包
https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
上傳到/usr/local/src目錄下
2、編譯安裝Go到/usr/local
tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/
#註:必須使用root賬戶或者使用sudo來解壓縮Go源碼包
3、設定PATH環境變數,添加/usr/local/go/bin到環境變數
export PATH=$PATH:/usr/local/go/bin
4、安裝到自訂位置
Go二進位檔案預設安裝到/usr/local/go,但是可以安裝Go工具到不同的位置,可以自行定義,只需要設定正確的環境變數。
例如,安裝Go到家目錄下,必須添加環境變數到$HOME/.profile
export GOROOT=$HOME/goexport PATH=$PATH:$GOROOT/bin
註:安裝Go到其他目錄時,GOROOT必須設定為環境變數
5、檢查是否正確安裝程式
通過設定一個工作區和建立一個簡單的程式,檢查是否正確安裝了一個簡單的程式。建立一個目錄包含您的工作空間,例如/data/work,並設定GOPATH環境變數指向的位置。
export GOPATH=/data/work
#如果不存在/data/work,需要建立
然後,在你的工作內建立src/github.com/user/hello,如果使用github,可以使用自己的使用者名稱代替user,在hello目錄下,建立hello.go
# cat hello.gopackage mainimport "fmt"func main {fmt.Printf("hello,world!\n")}
#使用go編譯hello.go
go install github.com/user/hello
#上面的命令講名叫hello(or hello.exe)的程式放到你的工作區內,執行下面命令,會得到輸出結果。
$GOPATH/bin/hellohello,world!
#當出現hello,world!表明Go已經安裝成功可以工作。
二、Go工作區介紹
1、機構組織代碼概述
Go語言程式通常將所有的代碼儲存在一個工作區中。
工作區包含許多版本控制庫(由Git管理)。
每個存放庫包含一個或多個包。
每個包由一個或多個在一個目錄中的源檔案組成。
一個包的目錄的路徑決定其匯入路徑。
註:同於其他的編程環境中,每一個項目都有一個獨立的工作區且工作區是緊密聯絡在一起的版本控制庫。
2、工作區介紹
工作區是一個目錄階層,它的根目錄有三個目錄:
src 包含Go源檔案
pkg 包含對象和包
bin 包含可執行命令
Go工具建立源碼包並安裝二進位檔案到pkg和bin目錄下
src目錄通常包含多個版本控制庫(如Git或Mercurial),跟蹤一個或多個源包的開發。
下面展示一個好的工作區的例子:
bin/hello # command executableoutyet # command executablepkg/linux_amd64/github.com/golang/example/stringutil.a # package objectsrc/github.com/golang/example/.git/ # Git repository metadatahello/hello.go # command sourceoutyet/main.go # command sourcemain_test.go # test sourcestringutil/reverse.go # package sourcereverse_test.go # test sourcegolang.org/x/image/.git/ # Git repository metadatabmp/reader.go # package sourcewriter.go # package source... (many more repositories and packages omitted) ...
上面的屬性圖展示了一個包含兩個存放庫(example和image)的工作區,example 存放庫包含兩個命令(hello,outyet),image庫包含bmp包和幾個其他的包。
一個典型的工作區包含包含許多軟體包和命令的多個源庫。大多數程式員將所有的原始碼和依賴關係儲存在一個工作區中
3、GOPATH環境變數設定
GOPATH環境變數指定工作區的位置。它很可能是唯一的環境變數,代碼開發時需要設定。
開始,建立一個工作區目錄並設定相應的gopath。您的工作區可以位於任何你喜歡的地方,但我們將在這個文檔中使用/data/work。請注意,這不能是您的“Go安裝”路徑相同。
mkdir -p /data/workexport GOPATH=/data/work
為了方便。添加工作區的bin到PATH中
export PATH=$PATH:$GOPATH/bin
4、匯入路徑
一個匯入路徑是唯一標識一個包的字串。一個包的匯入路徑對應於它在工作區內或遠程存放庫中的位置。
從標準庫的軟體包中給出了短的匯入路徑等。對於您自己的包,您必須選擇不可能和未來添加到標準庫或其他外部庫的基礎路徑衝突的路徑。
注意,你不需要將你的代碼發布到一個遠程存放庫之前,你可以建立它。這隻是一個很好的習慣來組織你的代碼,如果你有一天會出版它。在實踐中,你可以選擇任何任意的路徑名稱,只要它是唯一的標準庫和更大的去生態系統。
我們將使用github.com/user作為我們的基本路徑。在您的工作區中建立一個目錄,以保持原始碼:
mkdir -p $GOPATH/src/github.com/user
5、第一個項目
編譯並運行一個簡單的程式,首先選擇一個包的路徑(我們將使用github.com/user/hello)和建立在您的工作區相應的軟體包目錄:
mkdir $GOPATH/src/github.com/user/hello
建立名叫hello.go的檔案,上面建立過,此處略過。
cd $GOPATH/src/github.com/user/hellogo install$GOPATH/bin/hello
或者:
hello
如果你使用的是一個原始程式碼控制系統,現在是一個很好的時間來初始化一個存放庫,添加檔案,並提交你的第一次更改。再次,這一步是可選的:您不需要使用原始程式碼控制來寫代碼。
cd $GOPATH/src/github.com/user/hellogit initInitialized empty Git repository in /data/work/src/github.com/user/hello/.git/git add hello.gogit commit -m "first commit"[master (root-commit) bbfb477] first commit
6、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 mainimport ("fmt""github.com/user/stringutil")func main() {fmt.Printf(stringutil.Reverse("\n !oG ,olleH"))}
無論使用go安裝包還是二進位檔案,所有相關的依賴都會自動安裝。所以當你安裝hello程式時:
$ go install github.com/user/hello
對應的stringutil包會自動安裝好。
執行新的hello程式,可以看到訊息已經被反轉
# helloHello, 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可執行程式都通過靜態方式連結在一起,所以在運行時是不需要相關的包對象(庫)。
7、包命令
所有的Go原始碼都以下面的語句開始:
package name
其中name就是包引用預設的名稱,一個包中的所有檔案必須使用同一個包名,可執行命令必須是main。
一個二進位檔案下所有的包名不需要唯一,但是引用路徑必須唯一
8、測試
Go內建了一個輕量級的測試架構,由go test和testing包組成。
可以通過建立xx_test.go寫一個測試,其中包含若干個TestXXX函數。測試架構會自動執行這些函數;如果函數中包含tError或t.Fail, 對應的測試會被判為失敗。
添加一個針對stringutil的測試檔案$GOPATH/src/github.com/user/stringutil/reverse_test.go,包含以下內容:
package stringutilimport "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/stringutilok github.com/user/stringutil 0.002s
#同樣的,在包檔案夾下可以忽略路徑而直接執行go test
[root@zabbix stringutil]# go testPASSok github.com/user/stringutil 0.002s
9、遠程包
包的引用路徑用來描述如何通過版本控制系統擷取包的原始碼。go工具通過引用路徑自動從遠程代碼倉庫擷取包檔案。比如本文中用的例子也對應的儲存在github.com/golang/example下。go可以通過包的代碼倉庫的url直接擷取、產生、安裝對應的包。
[root@zabbix ~]# go get github.com/golang/example/hello[root@zabbix ~]# $GOPATH/bin/helloHello, Go examples!
如果工作區中不存在對應的包,go會將對應的包放到GOPATH環境變數指明的工作區下。(如果包已經存在,go跳過代碼拉去而直接執行go install)
執行上邊的go get命令後,工作空間檔案夾下是這樣的結果:
github上的hello命令依賴於同個倉庫下的stringutil庫,hello.go使用同樣的路徑進行匯入,所以go get命令能夠直接找到並安裝對應的依賴包。
import "github.com/golang/example/stringutil"
#通過這種方式共用Go包最好。
#註:關於go工具遠程包的更多資訊,參考:https://golang.org/cmd/go/#hdr-Remote_import_paths
10、官方地址
Go高效編程:https://golang.org/doc/effective_go.html
Go編程執行個體:https://tour.golang.org/welcome/