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 | project/ |
🧷 定義共用常數與變數
🧮 consts/consts.go
1
2
3
4
5
6
7package 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
30package 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
15package 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
7package 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 | import "github.com/joho/godotenv" |
🎯 總結
本篇整理了跨套件共享常數與變數的實務技巧與建議,確保整體架構清楚、可維護。
- ✅ 使用
consts
套件集中定義常數 - ✅ 將設定邏輯封裝於
config
,並在init()
時載入 - ✅ 統一變數命名與初始化模式,提升程式一致性
- ✅ 配合環境變數或設定檔,靈活應對多環境需求
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go