配置和环境变量

后端项目里,经常需要配置:

  • 服务端口
  • 数据库地址
  • JWT 密钥
  • Redis 地址
  • 运行环境

这些值不要写死在代码里。

一、读取环境变量

package main

import (
	"fmt"
	"os"
)

func main() {
	port := os.Getenv("APP_PORT")
	if port == "" {
		port = "8080"
	}

	fmt.Println("port:", port)
}

运行:

APP_PORT=9000 go run .

Windows PowerShell:

$env:APP_PORT="9000"
go run .

二、封装配置结构体

package config

import "os"

type Config struct {
	AppEnv string
	Port   string
}

func Load() Config {
	return Config{
		AppEnv: getEnv("APP_ENV", "local"),
		Port:   getEnv("APP_PORT", "8080"),
	}
}

func getEnv(key, defaultValue string) string {
	value := os.Getenv(key)
	if value == "" {
		return defaultValue
	}
	return value
}

使用:

cfg := config.Load()
fmt.Println(cfg.Port)

三、布尔和数字配置

环境变量都是字符串,需要转换。

package config

import (
	"os"
	"strconv"
)

func getBool(key string, defaultValue bool) bool {
	value := os.Getenv(key)
	if value == "" {
		return defaultValue
	}

	result, err := strconv.ParseBool(value)
	if err != nil {
		return defaultValue
	}

	return result
}

数字:

func getInt(key string, defaultValue int) int {
	value := os.Getenv(key)
	if value == "" {
		return defaultValue
	}

	result, err := strconv.Atoi(value)
	if err != nil {
		return defaultValue
	}

	return result
}

四、.env 文件

Go 标准库不会自动读取 .env

如果项目需要 .env,可以使用第三方库,例如:

go get github.com/joho/godotenv

本教程重点是 Go 标准库,所以只演示环境变量读取。

真实项目可以在程序启动时加载 .env,生产环境通常由部署平台注入环境变量。

五、不要提交敏感配置

.env.example 可以提交:

APP_ENV=local
APP_PORT=8080
DATABASE_URL=mysql://user:password@127.0.0.1:3306/app
JWT_SECRET=please-change-me

真实 .env 不提交:

.env

六、配置建议

  • 配置集中在一个包里读取。
  • 密码、密钥只从环境变量读取。
  • 端口、运行环境这类非敏感配置可以有默认值。
  • 启动时尽早检查必填配置。

示例:

func mustGetEnv(key string) string {
	value := os.Getenv(key)
	if value == "" {
		panic("missing env: " + key)
	}
	return value
}

生产项目里,缺少关键配置时应尽早失败,而不是运行到一半才报错。