學習筆記-初識Go
文章目錄
Go 學習
工作空間
- 包含三個子目錄
src
目錄包含Go的原始檔,它們被組織成包(每個目錄都對應一個包)pkg
目錄包含包物件bin
目錄包含可執行命令
GOPATH環境變數
-
在
~/.profile
中加入export GOPATH=$HOME/gowork export PATH=$PATH:$GOPATH/bin
-
但是後面直接執行
go install
時候報錯,找不到bin-
解決:在
~/.profile
中直接加入export GOBIN=$PATH:$GOPATH/bin
-
-
-
執行配置
source $HOME/.profile
建立第一個程式並執行
-
建立相應的包目錄
$ mkdir $GOPATH/src/github.com/user/hello
-
在該目錄下建立名為
hello.go
的檔案,其程式碼為package main import "fmt" func main() { fmt.
-
用go工具構建並安裝此程式
-
系統任何地方都可以執行,go工具會根據GOPATH指定的工作空間,在
github.com/user/hello
包內查詢原始碼go install github.com/user/hello
-
若在包目錄下執行
go install
,可以省略包路徑$ cd $GOPATH/src/github.com/user/hello $ go install
此命令會構建
hello
命令,產生一個可執行的二進位制檔案。 接著它會將該二進位制檔案作為hello
(在 Windows 下則為hello.exe
bin
目錄中
-
-
執行程式
-
輸入完整路徑執行
$ $GOPATH/bin/hello Hello, world.
-
如果
$GOPATH/bin
新增到PATH
中了,只需輸入該二進位制檔名即可$ hello Hello, world.
-
-
新建本地倉庫並將程式碼推到遠端倉庫
-
初始化倉庫
git init
-
新增到快取區
git add *
-
新增備註,可以用於版本回退
git commit -m "something change"
-
關聯遠端倉庫
git remote add origin github.com/user/project
-
推送程式碼到遠端倉庫
git push -u origin master
-
建立一個庫
-
選擇包路徑(使用
github.com/user/stringutil
) 並建立包目錄:$ mkdir $GOPATH/src/github.com/user/stringutil
-
在目錄中建立名為
reverse.go
檔案,內容如下// stringutil contain a function which is used to handle string package stringutil // reverse the string 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
檔案使用它package main import ( "fmt" "github.com/user/stringutil" ) func main() { fmt.Printf(stringutil.Reverse("!oG ,olleH")) }
-
執行
hello.go
無論是安裝包還是二進位制檔案,
go
工具都會安裝它所依賴的任何東西。 因此當我們通過$ go install github.com/user/hello
來安裝
hello
程式時,stringutil
包也會被自動安裝。執行此程式的新版本,你應該能看到一條新的,反向的資訊:
$ hello Hello, Go!
-
包名
Go原始檔中的第一個語句必須是
package 名稱
這裡的 名稱 即為匯入該包時使用的預設名稱。 (一個包中的所有檔案都必須使用相同的 名稱。)
Go的約定是包名為匯入路徑的最後一個元素:作為 “
crypto/rot13
” 匯入的包應命名為rot13
。可執行命令必須使用
package main
。連結成單個二進位制檔案的所有包,其包名無需是唯一的,只有匯入路徑(它們的完整檔名) 才是唯一的。
測試
-
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
-