iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

Go in 3o系列 第 24

[Day24] Go in 30 - 套件(package) - 第三方模組或套件

  • 分享至 

  • xImage
  •  

一、 本篇提要

如果我們需要使用網路上別人公開的套件,可用 go get 指令下載它到系統中 $GOPATH\pkg\mod 位置。有需要時就使用 go mod tidy,讓 Go 去尋找你下載的套件位於何處。

  • 用 go get 下載第三方模組或套件
  • 模組與套件路徑
  • 套件的呼叫與執行

二、第三方模組範例

假設我們要使用一個公開套件: github.com/gorilla/mux

step 1. go mod init

go mod init

step 2. go get 下載安裝:

C:\Users\Ricky\go\project\src\project01>go get -u github.com/gorilla/mux

用 go get 下載時,Go語言應該會自動更新,go.mod 的內容。
如果沒有,可以使用 go mod tidy,如果還是沒有,可以設置 GO111MODULE=on 來開啟。

https://ithelp.ithome.com.tw/upload/images/20231004/20162693q36Mr7J4q7.png

step 3. 使用套件

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 :
https://ithelp.ithome.com.tw/upload/images/20231004/201626939Dm2EAMEL0.png

go.sum :
https://ithelp.ithome.com.tw/upload/images/20231004/20162693MmdftSInRm.png

關於指令 go mod vendor

若使用指令 go mod vendor,這會將第三方模組/套件,拷貝一份放在專案資料夾的vendor目錄下,系統內沒有的話則會嘗試自行下載。

如果專案內含有 vendor 資料夾,專案就會使用它內含的原始碼,而不是從$GOPATH存取,這麼做好處就是你可以將套件打包一起,別人不用下載,但缺電就是很佔空間。

三、Go 模組與套件路徑

Go語言的模組與套件路徑,一般由以下組成 :

  • repository root path : 例如 golang.org/x/example 或 github.com/golang/example 。
  • 如果模組不是定義在 repository root path,那麼它會有模組子目錄(module subdirectory) 。
  • 要是模組有第二個版本以上,模組路徑也應包含版本號,例如: .../example/sub/v2 。
  • 對於模組以下的套件,就是模組路徑加上套件路徑,例如:.../example/hello 。

四、套件的呼叫與執行

4.1 套件別名

Go 語言允許賦予套件別名,這麼做的理由如下 :

  • 其他人的套件名稱不容易理解其目的,為了明確一點
  • 套件名稱過長,用別名簡化
  • 套件名稱撞名

語法簡單 :

import <別名> <套件>

以下是套件別名運用實例 :

package main

import (
    f "fmt" //把fmt取名為f
)

func main() {
    //以別名呼叫fmt
    f.Println("Hello World")
}

4.2 init() 函式

Go套件,基本上分為兩種,可執行與不可執行的。

main 套件是特殊的,因為它是唯一可以直接執行的套件。
main套件中一定要有一個main()函式,這就是在使用指令go run、go build 會去尋找並執行的對象。

不過,任何套件中(包含main套件),還可以定義一個特殊的函式init(),它用來初始化,以下幾個例子 :

  • 設置資料庫連線
  • 初始化套件變數
  • 建立檔案
  • 載入設定組態
  • 驗證或修復程式

對於一個套件檔案,Go語言會以下面的執行順序呼叫init()和 main() :

  1. 初始化外部套件
  2. 初始化套件本身
  3. 執行外部套件init()
  4. 執行自身套件init()
  5. 如果執行檔案是main套件,最後則會呼叫套件本身的main()函式

注意: init() 函式不能有參數跟回傳值 !!!

4.3 執行多個init()

一個套件中可以有多個 init(),可以將初始化動作更加模組化,讓程式容易維護。
當我們要初始化這不同檔案、建立資料庫連線等等,全塞在一個init()太複雜,難以區分,如果套件內有多重init(),執行順序也回由上而下依序執行。

且全部init()執行完,才會執行main() (如果是main套件的話)。

那麼以上就是套件的組織、第三方套件使用、初始化的介紹。


上一篇
[Day23] Go in 30 - 套件(package) - 簡介
下一篇
[Day25] Go in 30 - Debug
系列文
Go in 3o30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言