如何配置Go语言配置文件?Go配置最佳实践与疑问全解
- 虚拟主机
- 2026-02-09
- 2993
常用配置文件格式
(1) JSON 配置
// config.json { "server": { "host": "0.0.0.0", "port": 8080 }, "database": { "url": "postgres://user:pass@localhost/db", "max_conns": 20 } }
解析代码:
package main import ( "encoding/json" "os" ) type Config struct { Server struct { Host string `json:"host"` Port int `json:"port"` } `json:"server"` Database struct { URL string `json:"url"` MaxConns int `json:"max_conns"` } `json:"database"` } func loadConfig(path string) (Config, error) { var config Config file, err := os.Open(path) if err != nil { return config, err } defer file.Close() decoder := json.NewDecoder(file) err = decoder.Decode(&config) return config, err } func main() { config, _ := loadConfig("config.json") println("Server Port:", config.Server.Port) // 输出: 8080 }
(2) YAML 配置
# config.yaml server: host: "0.0.0.0" port: 8080 database: url: "postgres://user:pass@localhost/db" max_conns: 20
解析代码(需安装 gopkg.in/yaml.v3):
go get gopkg.in/yaml.v3 import "gopkg.in/yaml.v3" // 使用与 JSON 相同的 Config 结构体 func loadYAMLConfig(path string) (Config, error) { var config Config data, err := os.ReadFile(path) if err != nil { return config, err } err = yaml.Unmarshal(data, &config) return config, err }
(3) TOML 配置
# config.toml [server] host = "0.0.0.0" port = 8080 [database] url = "postgres://user:pass@localhost/db" max_conns = 20
解析代码(需安装 github.com/BurntSushi/toml):
go get github.com/BurntSushi/toml import "github.com/BurntSushi/toml" func loadTOMLConfig(path string) (Config, error) { var config Config _, err := toml.DecodeFile(path, &config) return config, err }
(4) 环境变量配置
package main import ( "os" "strconv" ) type EnvConfig struct { Host string Port int DBURL string MaxConns int } func loadEnvConfig() EnvConfig { port, _ := strconv.Atoi(os.Getenv("PORT")) // 转换字符串为整数 return EnvConfig{ Host: os.Getenv("HOST"), Port: port, DBURL: os.Getenv("DB_URL"), MaxConns: 20, // 默认值 } }
启动时指定环境变量:
HOST=0.0.0.0 PORT=8080 DB_URL=postgres://... ./app
高级方案:Viper 库
Viper 是 Go 生态中最流行的配置管理库,支持多格式、热加载、环境变量等。

安装 Viper
go get github.com/spf13/viper
示例代码
package main import ( "fmt" "github.com/spf13/viper" ) func main() { // 设置配置文件路径和格式 viper.SetConfigName("config") // 文件名 (不带扩展名) viper.SetConfigType("yaml") // 格式 (json/toml/yaml...) viper.AddConfigPath(".") // 搜索路径 // 读取配置 if err := viper.ReadInConfig(); err != nil { panic(fmt.Errorf("fatal error config file: %w", err)) } // 获取值 port := viper.GetInt("server.port") fmt.Println("Server Port:", port) // 输出: 8080 // 支持环境变量覆盖 (优先使用环境变量) viper.AutomaticEnv() dbURL := viper.GetString("database.url") // 若存在 DATABASE_URL 环境变量则覆盖 }
配置最佳实践
-
分层配置:
- 默认配置(代码中硬编码)
- 配置文件(JSON/YAML/TOML)
- 环境变量(生产环境安全覆盖)
- 命令行参数(动态调整)
-
敏感信息处理:


- 使用环境变量或密钥管理服务(如 HashiCorp Vault)
- 避免将密码/密钥提交到代码仓库!
-
热重载:
- Viper 支持 viper.WatchConfig() 监听文件变化: viper.OnConfigChange(func(e fsnotify.Event) { fmt.Println("Config changed:", e.Name) }) viper.WatchConfig()
完整项目结构示例
myapp/ ├── config/ │ ├── config.yaml # 开发环境配置 │ └── config.prod.yaml # 生产环境配置 ├── main.go └── .env # 本地环境变量(可选)
代码中根据环境加载配置:
func initConfig() { viper.SetConfigType("yaml") env := os.Getenv("APP_ENV") // 通过环境变量指定配置 if env == "production" { viper.SetConfigName("config.prod") } else { viper.SetConfigName("config") } viper.AddConfigPath("./config") // ... 其他设置 }
| 方案 | 适用场景 | 特点 |
|---|---|---|
| 标准库 | 简单 JSON/环境变量 | 无需额外依赖 |
| Viper | 复杂项目,多格式/热加载需求 | 功能全面,生态成熟 |
| 环境变量 | 容器化部署(Docker/K8s) | 安全且符合 12-Factor 原则 |
根据项目复杂度选择合适方案,推荐 Viper 处理大多数场景!