Sevice Computing:如何使用Go編程
如何使用Go編程
本文檔展示了一個簡單Go包的開發,並介紹了用go工具來獲取、 構建並安裝Go包及命令的標準方式。
1、理解代碼組織
1)工作空間
Go代碼必須放在工作空間內。它其實就是一個目錄,其中包含三個子目錄:
– src 目錄包含Go的源文件,它們被組織成包(每個目錄都對應一個包),
– pkg 目錄包含包對象,
– bin 目錄包含可執行命令。
go 工具用於構建源碼包,並將其生成的二進制文件安裝到 pkg 和 bin 目錄中。
src 子目錄通常包會含多種版本控制的代碼倉庫(例如Git或Mercurial), 以此來跟蹤一個或多個源碼包的開發。
其目錄結構如下圖所示:
bin/
streak # 可執行命令
todo # 可執行命令
pkg/
linux_amd64/
code.google.com/p/goauth2/
oauth.a # 包對象
github.com/nf/todo/
task.a # 包對象
src/
code.google.com/p/goauth2/
.hg/ # mercurial 代碼庫元數據
oauth/
oauth.go # 包源碼
oauth_test.go # 測試源碼
github.com/nf/
streak/
.git/ # git 代碼庫元數據
oauth.go # 命令源碼
streak.go # 命令源碼
todo/
.git/ # git 代碼庫元數據
task/
task.go # 包源碼
todo.go # 命令源碼
此工作空間包含三個代碼庫(goauth2、streak 和 todo),兩個命令(streak 和 todo) 以及兩個庫(oauth 和 task)。
2)GOPATH 環境變量
GOPATH 環境變量指定了你的工作空間位置。它是你在開發Go代碼時, 唯一需要設置的環境變量。
首先創建一個工作空間目錄,並設置相應的 GOPATH。你的工作空間可以放在任何地方, 在此文檔中我們使用 $HOME/work
。
注意,它絕對不能和你的Go安裝目錄相同。 (另一種常見的設置是 GOPATH=$HOME。)
$ mkdir $HOME/work //前面是路徑,最後的work是你的文件名
$ export GOPATH=$HOME/work
作爲約定,請將此工作空間的 bin 子目錄添加到你的 PATH 中:
$ export PATH=$PATH:$GOPATH/bin
更多環境變量相關的指令和設置可以 參考這裏
3)包路徑
標準庫中的包有給定的短路徑,比如 “fmt” 和 “net/http”。 對於你自己的包,你必須選擇一個基本路徑,來保證它不會與將來添加到標準庫, 或其它擴展庫中的包相沖突。
如果你將你的代碼放到了某處的源碼庫,那就應當使用該源碼庫的根目錄作爲你的基本路徑。 例如,若你在 GitHub 上有賬戶 github.com/user 那麼它就應該是你的基本路徑。
2、編寫你的第一個程序
要編譯並運行簡單的程序,首先要選擇包路徑(我們在這裏使用 github.com/user/hello),並在你的工作空間內創建相應的包目錄:
$ mkdir $GOPATH/src/github.com/user/hello
如果報錯顯示mkdir:無法創建目錄,沒有那個文件或目錄。那麼可以在midir的後面加上參數-p,即沒有找到此目錄就自動創建。也就是輸入如下命令即可:
$ mkdir -p $GOPATH/src/github.com/user/hello
接着,在該目錄中創建名爲 hello.go 的文件,使用命令sudo touch hello.go
創建新文件,其內容爲以下Go代碼:
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
現在你可以用 go 工具構建並安裝此程序了:
$ go install github.com/user/hello
注意,你可以在系統的任何地方運行此命令。go 工具會根據 GOPATH 指定的工作空間,在 github.com/user/hello 包內查找源碼。
若在從包目錄中運行 go install,也可以省略包路徑:
$ cd $GOPATH/src/github.com/user/hello
$ go install
然後在命令行中輸入它的完整路徑來運行:
$ $GOPATH/bin/hello
最後將代碼推送到GitHub遠程倉庫上,遠程倉庫的連接和配置過程請移步這篇博客
GitHub遠程連接配置
這裏不得不提的是我在配置好GitHub的遠程連接以後,不知道是因爲改了哪裏的配置,然後就導致go的所有指令都無法運行,報錯信息是無法找到該指令。
導致出現這個問題的原因我現在還不清楚,猜測可能是不小心改了prifile的目錄或者內容?但是我改回去也沒有解決這個問題。
最後的解決辦法是,重裝大法好。重新sudo yum install golang
,又檢查了一遍配置,然後就可以了。
- 一個關於檢查golang是否裝好了的小tips:
使用go env命令,如果出現如下圖所示,則說明go配置正確
2、你的第一個庫
讓我們編寫一個庫,並讓 hello 程序來使用它。
同樣,第一步還是選擇包路徑(我們將使用 github.com/user/stringutil) 並創建包目錄:
$ mkdir $GOPATH/src/github.com/user/stringutil
接着,在該目錄中創建名爲 reverse.go 的文件,內容如下:
// stringutil 包含有用於處理字符串的工具函數。
package stringutil
// Reverse 將其實參字符串以符文爲單位左右反轉。
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 文件(它位於 $GOPATH/src/github.com/user/hello)去使用它:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}
無論是安裝包還是二進制文件,go 工具都會安裝它所依賴的任何東西。 因此當我們通過
$ go install github.com/user/hello
來安裝 hello 程序時,stringutil 包也會被自動安裝。
運行此程序的新版本,你應該能看到一條新的,反向的信息:
bin/
hello # 可執行命令
pkg/
linux_amd64/ # 這裏會反映出你的操作系統和架構
github.com/user/
stringutil.a # 包對象
src/
github.com/user/
hello/
hello.go # 命令源碼
stringutil/
reverse.go # 包源碼
Go的可執行命令是靜態鏈接的;在運行Go程序時,包對象無需存在。
3、測試
Go擁有一個輕量級的測試框架,它由 go test 命令和 testing 包構成。
你可以通過創建一個名字以 _test.go 結尾的,包含名爲 TestXXX 且簽名爲 func (t *testing.T) 函數的文件來編寫測試。 測試框架會運行每一個這樣的函數;若該函數調用了像 t.Error 或 t.Fail 這樣表示失敗的函數,此測試即表示失敗。
我們可通過創建文件 $GOPATH/src/github.com/user/stringutil/reverse_test.go 來爲 stringutil 添加測試,其內容如下:
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
同樣,若你在包目錄下運行 go 工具,也可以忽略包路徑
$ go test
運行結果如下:
4、遠程包
像Git或Mercurial這樣的版本控制系統,可根據導入路徑的描述來獲取包源代碼。go 工具可通過此特性來從遠程代碼庫自動獲取包。例如,本文檔中描述的例子也可存放到Google Code上的Mercurial倉庫 code.google.com/p/go.example 中,若你在包的導入路徑中包含了代碼倉庫的URL,go get 就會自動地獲取、 構建並安裝它:
$ go get github.com/golang/example/hello
$ $GOPATH/bin/hello
運行結果如下:
若指定的包不在工作空間中,go get 就會將會將它放到 GOPATH 指定的第一個工作空間內。(若該包已存在,go get 就會跳過遠程獲取, 其行爲與 go install 相同)
在執行完上面的go get 命令後,工作空間的目錄樹看起來應該是這樣的:
bin/
hello # 可執行命令
pkg/
linux_amd64/
code.google.com/p/go.example/
stringutil.a # 包對象
github.com/user/
stringutil.a # 包對象
src/
code.google.com/p/go.example/
hello/
hello.go # 命令源碼
stringutil/
reverse.go # 包源碼
reverse_test.go # 測試源碼
github.com/user/
hello/
hello.go # 命令源碼
stringutil/
reverse.go # 包源碼
reverse_test.go # 測試源碼
更多詳細go語言編程內容請移步:
參考文檔
Github代碼傳送門