Go | 巢狀套件與子套件應用
💬 簡介
當專案不再只是幾個檔案、幾個函式時,如何組織好套件結構就變得格外重要。透過 巢狀套件(nested packages) 的方式,我們可以將功能邏輯依層分類,讓專案架構清晰可維護。
本篇將介紹 Go 語言中巢狀套件的設計方式、命名原則,以及如何使用子套件有效組織大型專案。
圖片來源:Gophers
🔍 什麼是巢狀套件?
巢狀套件是指套件中再包含子套件,透過資料夾結構的層次劃分出子功能模組。
- 📁 範例如下:
1
2
3
4
5
6
7
8
9project/
├── main.go
├── service/
│ ├── user/
│ │ ├── handler.go
│ │ └── validator.go
│ └── order/
│ ├── handler.go
│ └── validator.go📝 在這個結構中,
user
與order
都是service
的子套件,這樣的分類方式可以有效拆解大型邏輯並避免功能混淆。
📂 套件命名與引用規則
在 Go 中,套件名稱與資料夾名稱通常相同,而巢狀套件引用方式為:
1 | import "yourproject/service/user" |
📝 巢狀套件之間 不會自動繼承父層套件的內容,若需使用必須顯式引入。
🧪 範例實作:拆分使用者邏輯
📁 專案結構
1
2
3
4
5
6project/
├── main.go
└── service/
└── user/
├── handler.go
└── validator.goservice/user/handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13package user
import (
"fmt"
)
func CreateUser(name string) {
if !IsValidName(name) {
fmt.Println("使用者名稱無效")
return
}
fmt.Println("使用者已建立:", name)
}service/user/validator.go
1
2
3
4
5
6
7package user
import "strings"
func IsValidName(name string) bool {
return len(strings.TrimSpace(name)) > 0
}📝 同一個子套件中的檔案,可以共用變數與函式,因為都屬於
user
套件。main.go
1
2
3
4
5
6
7package main
import "project/service/user"
func main() {
user.CreateUser("Alice")
}- 執行結果:
1
使用者已建立: Alice
📌 巢狀套件設計建議
建議做法 | 說明 |
---|---|
✅ 以功能劃分子套件 | 像是 user/ 、order/ 、auth/ 等 |
✅ 每個子套件設計專一職責 | 僅處理該功能的邏輯與驗證 |
✅ 子套件間避免循環引用 | 維持清晰的依賴方向 |
✅ 保持公開介面最小化 | 僅匯出需要讓外部使用的函式或型別 |
💡 進階技巧:跨子套件共用邏輯
若多個子套件需共用邏輯,可建立 internal/common
、pkg/shared
等中介層。
- 範例:
1
2
3
4
5
6
7
8project/
├── internal/
│ └── common/
│ └── validator.go
├── service/
│ └── user/
│ └── handler.go
└── main.go📝 如此一來,
user
或其他模組都能使用common
的邏輯,並集中維護。
🎯 總結
巢狀套件與子套件設計,是大型 Golang 專案中不可或缺的一環,合理的結構能帶來:
- ✅ 更清楚的責任劃分
- ✅ 更容易維護與擴充
- ✅ 更少命名衝突與邏輯混雜
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go