在开发命令行工具或者服务程序时,经常需要根据不同的运行环境加载不同的配置。比如本地调试用一套数据库地址,线上用另一套。这时候环境变量就成了最常用的解决方案之一。Go语言对环境变量的支持非常直接,用起来也挺顺手。
基础操作:读取单个环境变量
Go 的标准库 os 提供了 Getenv 函数,用来获取指定的环境变量值。如果变量不存在,返回空字符串。
package main
import (
"fmt"
"os"
)
func main() {
port := os.Getenv("PORT")
fmt.Println("端口:", port)
}
假设你在终端里执行:PORT=8080 go run main.go,程序就会输出 “端口: 8080”。这种方式适合快速测试,不用改代码就能切换配置。
处理缺失变量:必须存在的配置
有些配置不能缺,比如数据库密码。这时候可以用 LookupEnv,它返回两个值:变量值和是否存在。
dbPassword, exists := os.LookupEnv("DB_PASSWORD")
if !exists {
log.Fatal("缺少环境变量 DB_PASSWORD")
}
// 继续使用 dbPassword
这种写法能避免程序在错误环境中启动,提前暴露问题。
批量读取与调试
有时候你想看看当前程序能读到哪些环境变量,可以遍历全部变量。
for _, env := range os.Environ() {
pair := strings.SplitN(env, "=", 2)
fmt.Printf("键: %s, 值: %s\n", pair[0], pair[1])
}
这在排查部署问题时特别有用。比如你明明设置了变量,程序却读不到,打印一遍就知道是不是拼错了名字。
本地开发小技巧:.env 文件支持
虽然 Go 标准库不支持 .env 文件,但社区有现成方案。常用的是 godotenv 库,可以把 .env 里的内容加载进环境变量。
先安装:go get github.com/joho/godotenv
import "github.com/joho/godotenv"
func main() {
err := godotenv.Load()
if err != nil {
log.Print("无法加载 .env 文件")
}
apiKey := os.Getenv("API_KEY")
// 正常使用 apiKey
}
项目根目录建个 .env 文件:
API_KEY=abc123
PORT=3000
这样团队成员不用手动设置环境变量,开箱即用,减少“在我机器上是好的”这类问题。
生产环境建议
上线服务时,环境变量通常由容器平台(如 Docker 或 Kubernetes)注入。Dockerfile 里可以用 ENV 指令,K8s 则通过配置文件传入。不要把敏感信息硬编码进代码或提交到仓库。
例如 Dockerfile 中:
ENV PORT=80
ENV DB_HOST=prod-db.example.com
构建镜像后,这些变量会自动生效。