Package:Golang 專案的組織策略

更新於 發佈於 閱讀時間約 9 分鐘


raw-image

👨‍💻簡介

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

留言
avatar-img
留言分享你的想法!
阿Han-avatar-img
2023/09/07
寫得很清楚,很棒!
wang alan-avatar-img
發文者
2023/09/08
阿Han 謝謝哈哈,會持續努力分享知識
avatar-img
Alan的開發者天地
18會員
83內容數
golang
Alan的開發者天地的其他內容
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
Thumbnail
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
Thumbnail
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
Thumbnail
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
Thumbnail
⏳ 優質好文,歡迎支持與學習,讓阿Han給你最歡樂的學習課程、最貼近業界的實戰技巧…,just for fun fun fun…😄 相信對於具有開發基礎的學員們來說,基本的開發工程相信已經得心應手了, 那麼您們可能會苦於這些問題: ❓ 哇! pip install別人的程式好方便
Thumbnail
⏳ 優質好文,歡迎支持與學習,讓阿Han給你最歡樂的學習課程、最貼近業界的實戰技巧…,just for fun fun fun…😄 相信對於具有開發基礎的學員們來說,基本的開發工程相信已經得心應手了, 那麼您們可能會苦於這些問題: ❓ 哇! pip install別人的程式好方便
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News