Sevice Computing服務計算:go語言編程入門乾貨--如何使用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代碼傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章