知易通
第二套高阶模板 · 更大气的阅读体验

Go语言读取环境变量的实用技巧

发布时间:2025-12-14 03:27:25 阅读:391 次

在开发命令行工具或者服务程序时,经常需要根据不同的运行环境加载不同的配置。比如本地调试用一套数据库地址,线上用另一套。这时候环境变量就成了最常用的解决方案之一。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

构建镜像后,这些变量会自动生效。