Like Share Discussion Bookmark Smile

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

Go | 套件變數常數共享技巧

💬 簡介

在開發 Golang 專案時,常會遇到以下需求:

  • 多個套件需共用某些設定值(如:API 金鑰、資料夾路徑)
  • 系統需統一維護一些常數或全域變數
  • 跨模組取用設定資料時,希望保持 一致性、可維護性與初始化順序

本篇將說明如何有效地組織與共享變數與常數,並實作範例供參考。

圖片來源:Gophers


🎯 適合共用的項目有哪些?

類型 範例 建議使用位置
常數 const AppVersion = "1.0.0" consts/consts.go
共用變數 var Config *AppConfig config/config.go
設定資料 資料庫連線資訊、Token、開關參數等 config/config.go
初始化邏輯 調用 init() 載入 JSON 或環境變數等 統一於 config 套件中

📁 推薦目錄結構

1
2
3
4
5
6
7
8
project/
├── main.go
├── config/
│ └── config.go
├── consts/
│ └── consts.go
├── service/
│ └── logic.go

🧷 定義共用常數與變數

  • 🧮 consts/consts.go

    1
    2
    3
    4
    5
    6
    7
    package consts

    const (
    AppName = "MyApp"
    AppVersion = "1.0.0"
    LogPrefix = "[MyApp]"
    )

    📝 將常數集中管理,避免散落各處

  • ⚙️ config/config.go

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package config

    import (
    "encoding/json"
    "os"
    )

    type AppConfig struct {
    DBHost string `json:"db_host"`
    DBPort int `json:"db_port"`
    Debug bool `json:"debug"`
    }

    var Config *AppConfig

    func init() {
    file, err := os.Open("config.json")
    if err != nil {
    panic("無法讀取設定檔: " + err.Error())
    }
    defer file.Close()

    decoder := json.NewDecoder(file)
    cfg := &AppConfig{}
    if err := decoder.Decode(cfg); err != nil {
    panic("設定檔格式錯誤: " + err.Error())
    }

    Config = cfg
    }

    📝 利用 init() 自動載入設定檔,供其他套件使用,將設定資料封裝於指標變數 Config,跨套件取用。


🚀 實際使用範例

  • service/logic.go

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package service

    import (
    "fmt"
    "project/config"
    "project/consts"
    )

    func PrintEnv() {
    fmt.Println(consts.LogPrefix, "應用程式:", consts.AppName)
    fmt.Println("資料庫位置:", config.Config.DBHost, ":", config.Config.DBPort)
    if config.Config.Debug {
    fmt.Println("🔧 啟用除錯模式")
    }
    }
  • main.go

    1
    2
    3
    4
    5
    6
    7
    package main

    import "project/service"

    func main() {
    service.PrintEnv()
    }
  • 執行結果:
    1
    2
    3
    [MyApp] 應用程式: MyApp
    資料庫位置: localhost : 5432
    🔧 啟用除錯模式

⚠️ 注意事項與建議

項目 建議做法
初始化順序 使用 init() 自動處理設定載入,避免手動呼叫
避免全域污染 僅暴露封裝好的常數或結構變數(勿濫用 var
可測性 抽象化設定來源(如 LoadConfig()),便於測試切換
檔案命名 建議將常數放在 consts,設定放在 config

💡 延伸技巧:環境變數作為備援

如果不使用 JSON 檔,也可改用環境變數:

1
os.Getenv("DB_HOST")

或搭配 .env 檔與 github.com/joho/godotenv

1
2
3
4
5
import "github.com/joho/godotenv"

func init() {
_ = godotenv.Load()
}

🎯 總結

本篇整理了跨套件共享常數與變數的實務技巧與建議,確保整體架構清楚、可維護。

  • ✅ 使用 consts 套件集中定義常數
  • ✅ 將設定邏輯封裝於 config,並在 init() 時載入
  • ✅ 統一變數命名與初始化模式,提升程式一致性
  • ✅ 配合環境變數或設定檔,靈活應對多環境需求

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


註:以上參考了
Go