go modules——HelloWorld示例

  • 2021 年 2 月 17 日
  • 筆記

go modules——HelloWorld示例

  • go modules 存在的意義是方便程式碼的共享(雖然這會使自己開發過程中有一些小小的麻煩)

  • 開發第一步,創建一個github倉庫,然後克隆到本地

    首先創建一個github倉庫github.com/<username>/hello,這裡我的倉庫地址是:github.com/fudute/hello

    然後在本地拉取遠程倉庫:

    git clone //github.com/fudute/hello.git
    cd hello
    
  • 創建一個module

    go mod init github.com/fudute/hello
    

    注意這裡的後綴要和github的網址一致

    這會在當前目錄下創建一個go.mod文件,表示這是一個module。

    然後創建一個文件hello.go:

    package hello
    
    // Hello return "Hello World"
    func Hello() string {
        return "Hello World!"
    }
    

    和測試文件hello_test.go

    func TestHello(t *testing.T) {
    	tests := []struct {
    		name string
    		want string
    	}{
    		{name: "test", want: "Hello world!"},
    	}
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    			if got := Hello(); got != tt.want {
    				t.Errorf("Hello() = %v, want %v", got, tt.want)
    			}
    		})
    	}
    }
    

    現在進行測試:

    > go test
    PASS
    ok  	example.com/hello	0.002s
    

    說明功能沒有問題,這時候就可以準備提交了。但是在提交之前,還存在一個版本問題

  • module的版本問題

    版本的命名方式為 vMAJOR.MINOR.PATCH,有下面這些規則:

    • 當API發生向後不兼容的修改時,例如刪除某個API函數,這時候需要修改MAJOR版本號
    • 當API發生向後兼容的修改是,例如添加API函數,這時候需要修改MINOR版本號
    • 當API沒有發生修改,只是做了bug修復或者優化,這時候需要修改PATCH就可以
    • v0版本是不穩定版本,這個階段可能發生各種修改,是開發時的版本。如果覺得開發的已經足夠完善,那麼就可以提高到v1版本,表示這是一個相對穩定的版本。
  • 將module push到github上

    先提交當前目錄下的文件:

    git add *
    git commit -m "my first module"
    

    需要先給module添加一個版本標記,指定版本為 v0.1.0

    git tag v0.1.0
    

    然後push到github上

    git push origin v0.1.0
    
  • 創建另一個項目,使用之前的module

    接下來在本地創建一個main module

    mkdir main
    cd main
    go mod init main
    

    創建文件main.go

    package main
    
    import (
    	"fmt"
    
    	"github.com/fudute/hello"
    )
    
    func main() {
    	fmt.Println(hello.Hello())
    }
    
    

    在這裡導入了之前創建的module,路徑是github.com/fudute/hello,然後直接運行:

    > go run .
    go: extracting github.com/fudute/hello v0.1.0
    Hello World!
    

    可以看到,golang會自動從github上拉取module,然後成功編譯運行。

    自動下載的module可以在$GOPATH/pkg/mod目錄下看到。