如果我們需要使用網路上別人公開的套件,可用 go get 指令下載它到系統中 $GOPATH\pkg\mod 位置。有需要時就使用 go mod tidy,讓 Go 去尋找你下載的套件位於何處。
假設我們要使用一個公開套件: github.com/gorilla/mux
go mod init
C:\Users\Ricky\go\project\src\project01>go get -u github.com/gorilla/mux
用 go get 下載時,Go語言應該會自動更新,go.mod 的內容。
如果沒有,可以使用 go mod tidy,如果還是沒有,可以設置 GO111MODULE=on 來開啟。
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func YourHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", YourHandler)
http.Handle("/", r)
fmt.Println("Server starting!")
http.ListenAndServe(":8000", r)
}
其中,可以看到我們專案中的go.mod檔案以及go.sum :
go.mod :
go.sum :
關於指令 go mod vendor
若使用指令 go mod vendor,這會將第三方模組/套件,拷貝一份放在專案資料夾的vendor目錄下,系統內沒有的話則會嘗試自行下載。
如果專案內含有 vendor 資料夾,專案就會使用它內含的原始碼,而不是從$GOPATH存取,這麼做好處就是你可以將套件打包一起,別人不用下載,但缺電就是很佔空間。
Go語言的模組與套件路徑,一般由以下組成 :
Go 語言允許賦予套件別名,這麼做的理由如下 :
語法簡單 :
import <別名> <套件>
以下是套件別名運用實例 :
package main
import (
f "fmt" //把fmt取名為f
)
func main() {
//以別名呼叫fmt
f.Println("Hello World")
}
Go套件,基本上分為兩種,可執行與不可執行的。
main 套件是特殊的,因為它是唯一可以直接執行的套件。
main套件中一定要有一個main()函式,這就是在使用指令go run、go build 會去尋找並執行的對象。
不過,任何套件中(包含main套件),還可以定義一個特殊的函式init(),它用來初始化,以下幾個例子 :
對於一個套件檔案,Go語言會以下面的執行順序呼叫init()和 main() :
注意: init() 函式不能有參數跟回傳值 !!!
一個套件中可以有多個 init(),可以將初始化動作更加模組化,讓程式容易維護。
當我們要初始化這不同檔案、建立資料庫連線等等,全塞在一個init()太複雜,難以區分,如果套件內有多重init(),執行順序也回由上而下依序執行。
且全部init()執行完,才會執行main() (如果是main套件的話)。
那麼以上就是套件的組織、第三方套件使用、初始化的介紹。