👨‍💻簡介

套件(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

  1. 在你的工作目錄底下創建一個新資料夾:greetings
  2. greetings 資料夾中,創建一個名為 greetings.go 的檔案
// greetings/greetings.go
package greetings

import "fmt"

func SayHello(name string) {
    fmt.Println("Hello, " + name + "!")
}

可以看到,我們在 greetings 中建立了一個 SayHello 函式,讓我們可以打個招呼。

使用 Package

現在我們已經建立完 Package,讓我們來看看如何使用它:

  1. 使用 go mod init xxx 初始化專案以設定路徑,假設這邊是叫demo
  2. 創建一個名為 main.go 的檔案,放在與 greetings 資料夾不同的目錄下。
  3. 編寫以下程式碼:
// 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世界!

📚Reference