今天來講一下Go語言的Module的基本概念及創建方法,我本來以為Module跟Package是同樣的東西,但其實Module可以看成一堆Package的集合,且兩者還是有部份的差異
項目 | 套件(Package) | 模組(Module) |
---|---|---|
定義 | Go 檔案的集合,包含相關的函式、類型等。 | 由多個套件組成的一個版本化單位。 |
範圍 | 在模組內的更小單位,通常代表某個庫或功能模塊。 | 更高層級的結構,包含多個套件。 |
檔案 | 沒有專門檔案來定義套件。套件由 package 關鍵字指定。 |
由 go.mod 檔案來定義模組。 |
用途 | 用於在專案內組織和重用程式碼。 | 用於管理專案的依賴、版本控制及更大規模的程式碼結構。 |
可見性 | 透過命名方式來控制(大寫開頭為公開,否則為私有)。 | 不涉及可見性,主要用於依賴管理與版本控制。 |
版本控制 | 套件不單獨版本化。 | 模組是版本化的,可以管理特定版本的依賴模組。 |
匯入 | 可以透過 import "package-path" 來匯入。 |
模組在 go.mod 檔案中指定依賴,內部的套件可以匯入使用。透過go get 來下載依賴的模組。 |
在講解Module之前,我們需要先瞭解GOPATH的概念,GOPATH是Go語言的一個環境變數,用來指定Go語言的工作目錄,也就是說,我們的Go程式碼必須放在GOPATH下的src目錄下,這樣Go語言才能找到我們的程式碼。但是這樣的管理分式非常不直覺,所以在Go 1.11以後的版本,Go語言引入了Module的概念。
Module是一個目錄,裡面包含了一個go.mod文件,這個文件記錄了這個Module的相關資訊,例如Module的名稱、依賴的Module等等。
要建立一個Module,我們需要先進入到我們的專案目錄下,然後執行以下命令:
go mod init <module-name>
這樣就會在當前目錄下生成一個go.mod文件,用來管理裡面一開始只有Module名稱與Go版本,例如:
module mygo
go 1.17
然後我們就可以在這個Module下開始寫我們的程式碼了。
如果想把這個Module發佈到Github上,我們需要將Module的名稱改為Github的Repository名稱,例如:
go mod init github.com/c8763yee/mygo
# go mod init github.com/<username>/<module-name-or-repo-name-without-dot-git>
# or setup in go.mod
module github.com/c8763yee/mygo
module
:定義Module的名稱go
:定義Go的版本,這樣可以確保我們的程式碼在不同的Go版本下都能正常運行。require
:定義這個Module需要哪些外部的Module與指定的版本號。replace
:用來暫時替換某個Module為本地的Module資料夾,通常用於開發過程中,例如我們可以將某個Module替換為本地的Module(語法:replace <module-name> => <local-path>
)exclude
:用來排除某個Module,通常用於避免某個Module與其他Module衝突。module github.com/c8763yee/mygo
go 1.19
require (
github.com/gin-gonic/gin v1.7.4
github.com/go-sql-driver/mysql v1.6.0
)
replace mygo/five/exclamation => ../five/exclamation
replace excluded-module v1.2.3 => ./excluded-module
require mygo/five/exclamation v0.0.0-7-30120-30168
exclude excluded-module v1.2.3
那麼今天的文章就到這告一段落,如果我的文章有任何地方有錯誤請在留言區反應
這兩天將會介紹Go語言的內建套件:如time、strings, log, sort