1. 程式人生 > >學習筆記-初識Go

學習筆記-初識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.
    Printf("Hello, world.\n") }
  • 用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.Errort.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
      

學習連結