Like Share Discussion Bookmark Smile

J.J. Huang   2025-06-13   Getting Started Golang 07.套件   瀏覽次數:次   DMCA.com Protection Status

Go | 巢狀套件與子套件應用

💬 簡介

當專案不再只是幾個檔案、幾個函式時,如何組織好套件結構就變得格外重要。透過 巢狀套件(nested packages) 的方式,我們可以將功能邏輯依層分類,讓專案架構清晰可維護。

本篇將介紹 Go 語言中巢狀套件的設計方式、命名原則,以及如何使用子套件有效組織大型專案。

圖片來源:Gophers


🔍 什麼是巢狀套件?

巢狀套件是指套件中再包含子套件,透過資料夾結構的層次劃分出子功能模組。

  • 📁 範例如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    project/
    ├── main.go
    ├── service/
    │ ├── user/
    │ │ ├── handler.go
    │ │ └── validator.go
    │ └── order/
    │ ├── handler.go
    │ └── validator.go

    📝 在這個結構中,userorder 都是 service 的子套件,這樣的分類方式可以有效拆解大型邏輯並避免功能混淆。


📂 套件命名與引用規則

在 Go 中,套件名稱與資料夾名稱通常相同,而巢狀套件引用方式為:

1
import "yourproject/service/user"

📝 巢狀套件之間 不會自動繼承父層套件的內容,若需使用必須顯式引入。


🧪 範例實作:拆分使用者邏輯

  • 📁 專案結構

    1
    2
    3
    4
    5
    6
    project/
    ├── main.go
    └── service/
    └── user/
    ├── handler.go
    └── validator.go
  • service/user/handler.go

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package 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
    7
    package user

    import "strings"

    func IsValidName(name string) bool {
    return len(strings.TrimSpace(name)) > 0
    }

    📝 同一個子套件中的檔案,可以共用變數與函式,因為都屬於 user 套件。

  • main.go

    1
    2
    3
    4
    5
    6
    7
    package main

    import "project/service/user"

    func main() {
    user.CreateUser("Alice")
    }
  • 執行結果:
    1
    使用者已建立: Alice

📌 巢狀套件設計建議

建議做法 說明
✅ 以功能劃分子套件 像是 user/order/auth/
✅ 每個子套件設計專一職責 僅處理該功能的邏輯與驗證
✅ 子套件間避免循環引用 維持清晰的依賴方向
✅ 保持公開介面最小化 僅匯出需要讓外部使用的函式或型別

💡 進階技巧:跨子套件共用邏輯

若多個子套件需共用邏輯,可建立 internal/commonpkg/shared 等中介層。

  • 範例:
    1
    2
    3
    4
    5
    6
    7
    8
    project/
    ├── internal/
    │ └── common/
    │ └── validator.go
    ├── service/
    │ └── user/
    │ └── handler.go
    └── main.go

    📝 如此一來,user 或其他模組都能使用 common 的邏輯,並集中維護。


🎯 總結

巢狀套件與子套件設計,是大型 Golang 專案中不可或缺的一環,合理的結構能帶來:

  • ✅ 更清楚的責任劃分
  • ✅ 更容易維護與擴充
  • ✅ 更少命名衝突與邏輯混雜

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go