Go學習總結-go module

Sako發表於2019-05-05

包管理 - go module

go從v1.11版之後就推出了新的包管理,go module,它和之前的$GOPATH不同,已經不在需要src,bin這樣的子目錄了,一個原始碼目錄甚至是空目錄都可以作為module,只要其中包含有go.mod檔案。接下來看一下go module的能力。

初始化包

首先設定下環境變數 GO111MODULE=auto 如果go的版本是v1.11之後的可以不用設定這個變數,因為1.11之後的版本,預設都是使用go module。在$GOPATH以外的目錄裡新建個資料夾,然後執行

go mod init 模組名
複製程式碼

就能在目錄下看到go.mod檔案,裡面包含了模組的名稱,和go的版本

module goModule
go 1.12
複製程式碼

執行

在目錄下建一個hello.go檔案,引入gin這個第三方包

package main

import "github.com/gin-gonic/gin"

func main()  {
	router := gin.Default()
	router.Run()
}
複製程式碼

go module之前,我們需要執行 go get github.com/gin-gonic/gin來安裝包,現在不需要了,直接 go run hello.go 程式會自動下載需要的包。我們再配合 go proxy,在環境變數裡設定export GOPROXY=https://goproxy.io ,從此之後,不需要翻牆,也能快速的下載第三包了,簡直感人[]~( ̄▽ ̄)~*

再看看go.mod檔案

module goModule

go 1.12

require (
	github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
	github.com/gin-gonic/gin v1.3.0 // indirect
	github.com/golang/protobuf v1.3.1 // indirect
	github.com/mattn/go-isatty v0.0.7 // indirect
	github.com/ugorji/go v1.1.4 // indirect
	gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
	gopkg.in/yaml.v2 v2.2.2 // indirect
)
複製程式碼

require裡是程式需要的第三方包,也標明瞭版本號,而下載的原始碼包在$GOPATH/pkg/mod資料夾裡。

引入自定義包

現在引入自定義包,也不需要把原始碼放在$GOPATH/src資料夾裡了,直接使用模組名+路徑。在目錄裡新建一個test資料夾,資料夾裡建一個test.go,現在目錄結構:

├── go.mod
├── go.sum
├── hello.go
└── test
    └── test.go
複製程式碼

test.go?

// test.go
package test

import "fmt"

func Test(){
	fmt.Println("TEST")
}
複製程式碼

hell.go?

// hello.go
package main

import (
	"github.com/gin-gonic/gin"
	"goModule/test"  // 模組名 + 路徑
)


func main()  {
	test.Test() // 呼叫
	router := gin.Default()
	router.Run()
}
複製程式碼

最後直接go run hello.go,完美執行~~

講真在go module出來之前,go的包管理功能不是那麼好用,不論是版本管理,還是包下載,體驗都不太好。go module出來之後大大改善了包管理功能。

相關文章