Package:Golang 專案的組織策略
👨💻簡介
套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。
package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
今天這篇文章將快速瞭解 Golang 的package,學習如何建立package、匯入package以及一些使用技巧。
什麼是 Package?
在 Golang 中,Package 是一種組織程式碼的方式,它將相關的函式、變數和資源放在一個目錄中。這不僅有助於保持程式碼的整潔,還能讓我們更容易地重複使用程式碼。
Package 名稱與資料夾名稱的一致性
通常建議在建立package時,將package名稱與所在資料夾名稱保持一致,這樣有助於提高程式碼的可讀性和一致性。Golang 的匯入機制是基於package的 import 路徑來識別package,而 import 路徑通常會反映package的資料夾結構。這種一致性可以讓其他開發人員更容易理解你的程式碼,並且不需要額外的查找工作,因為package的名稱與資料夾名稱一致。
舉例來說,假設你的資料夾結構如下:
project/
|-- greetings/
| |-- greetings.go
|
|-- main/
| |-- main.go
如果我們建立的package名稱為 greetings
,我們可以在 greetings.go
中這樣定義:
// greetings.go
package greetings
func Hello(name string) string {
return "Hello, " + name
}
然後在 main.go
中使用這個package:
// main.go
package main
import (
"fmt"
"your/project/path/greetings"
)
func main() {
message := greetings.Hello("Alan")
fmt.Println(message)
}
在這個例子中,我們建立的package名稱 greetings
與所在資料夾名稱相同,確保匯入的時候路徑是一致的。
建立 Package
建立一個 Package之前,首先,我們需要創建一個目錄,我們取名叫 greetings
:
- 在你的工作目錄底下創建一個新資料夾:
greetings
- 在
greetings
資料夾中,創建一個名為greetings.go
的檔案
// greetings/greetings.go
package greetings
import "fmt"
func SayHello(name string) {
fmt.Println("Hello, " + name + "!")
}
可以看到,我們在 greetings
中建立了一個 SayHello
函式,讓我們可以打個招呼。
使用 Package
現在我們已經建立完 Package,讓我們來看看如何使用它:
- 使用
go mod init xxx
初始化專案以設定路徑,假設這邊是叫demo - 創建一個名為
main.go
的檔案,放在與greetings
資料夾不同的目錄下。 - 編寫以下程式碼:
// main.go
package main
import "demo/greetings"
func main() {
greetings.SayHello("Alan")
}
在main.go直接使用 greetings.SayHello
函式來印出hello到終端。
最後,我們可以在終端中執行我們的程式:
go run main.go
你應該會在終端看到輸出的問候訊息:「Hello, Alan」
到這裡已經成功地創建了一個 Golang 的 Package,並在自己的程式中使用它。
package的可見性
Golang 中的package成員有可導出(Exported)和不可導出(Unexported)之分。首字母大寫的成員是可導出的,其他package可以存取它們;而首字母小寫的成員則是不可導出的,僅在同一package內可見。以下是一個示例:
// greetings/greetings.go
package greetings
func sayHi(name string) {
fmt.Println("Hi, " + name + "!")
}
在這個範例中,sayHi
是不可導出的,無法在其他package中使用。
匯入package
匯入多個package
你可以使用括號匯入多個package,以提高程式碼的可讀性:
package main
import (
"fmt"
"your/project/path/greetings"
"your/project/path/utils"
)
func main() {
greetings.SayHello("Alan")
fmt.Println("Cube of 3:", utils.Cube(3))
}
package別名
當我們引入一個package時,我們可以為該package指定一個別名。這對於解決名稱衝突或縮短package名稱都很有用。
import mygreetings "your/project/path/greetings"
使用方式也很簡單,在package前面加上別名即可
接著調用函式如下
func main() {
mygreetings.SayHello("Alan")
}
這樣,你就可以使用 mygreetings
作為 greetings
package的別名,以更簡潔的方式訪問package中的函式。
這個方式尤其在當你的專案中有多個package需要引入時很有用,因為它可以幫助你更好地管理package的命名空間。
匿名package
假設你的 greetings
package路徑仍然是 your/project/path/greetings
,你可以引入它並使用匿名package,如下所示:
import _ "your/project/path/greetings"
可以看到,我們使用 _
作為匿名package的名稱,這表示我們不打算在程式碼中直接使用 greetings
package的名稱,但我們希望它執行package初始化的工作。
在這種情況下,你不需要在後續的程式碼中使用 greetings
package的名稱,而package初始化的工作仍然會執行,如果 greetings
package具有初始化邏輯(init 函式),那麼它將在引入時運行。
在某些情況下,你可能希望引入一個package,但你不打算在你的程式碼中直接使用該package中的函式或資源。相反,你只對package的一些「副作用」或初始化操作感興趣。這些初始化操作可能包括設置全局變數、執行某些初始化函式或設定package的配置。
使用匿名package的方式,你可以引入package,使它執行初始化操作,但你不需要在你的程式碼中使用它的功能。這就是「只關心副作用」的意思。你不需要直接與package的功能交互,只是希望package在你的程式啟動時執行某些操作,然後你的程式可以繼續運行。
舉個例子,假設你有一個package,它在初始化時設置了一個全局的日誌記錄器,但你的主程式不需要直接使用這個日誌記錄器。你可以使用匿名package的方式引入這個package,這樣它會在程式啟動時設置日誌記錄器,而你的程式可以繼續執行自己的邏輯,而不必直接與日誌package交互。
package的版本控制
管理package的版本是非常重要的。你可以使用 go get
命令安裝package並更新版本:
go get -u your/project/path/greetings
package的佈署與分享
如果你想分享你的package給其他人,你可以將package的原始碼上傳至版本控制系統,如 GitHub。其他人可以透過 go get
命令來安裝並使用你的package。
小結
package在 Golang 中扮演著組織程式碼、重複使用程式碼的重要角色。透過本文,我們學習了建立package、匯入package以及一些使用技巧,希望能幫助你更深入地理解 Golang 的package世界!