目录

Golang每日一库 - godotenv

3 3.1~4.0 分钟 1403

在 Go(Golang)中使用 .env 文件, 官方标准库不直接支持 ,但可以通过第三方库轻松实现。最流行、轻量且稳定的库是 godotenv


推荐方案:使用 godotenv

第一步:安装库

go get github.com/joho/godotenv

第二步:创建.env 文件(项目根目录)

# .env
APP_NAME=MyMonitor
PORT=8080

注意:

  • 不要提交 .env 到 Git(加到 .gitignore
  • 值不要加引号(除非包含空格或特殊字符)

第三步:在 Go 代码中加载.env

package main

import (
    "fmt"
    "log"
    "os"
    "time"

    "github.com/joho/godotenv"
)

func main() {
    // 加载 .env 文件
    if err := godotenv.Load(); err != nil {
        log.Println(" 未找到 .env 文件,使用系统环境变量")
    }

    // 读取配置
    appName := os.Getenv("APP_NAME")
    port := os.Getenv("PORT")

    // 转换类型(字符串 → 其他)
    checkInterval, _ := time.ParseDuration(os.Getenv("CHECK_INTERVAL"))
    logCheckInterval, _ := time.ParseDuration(os.Getenv("LOG_CHECK_INTERVAL"))

    fmt.Printf("应用: %s\n", appName)
    fmt.Printf("端口: %s\n", port)
    fmt.Printf("钉钉 Token: %s\n", token)
    fmt.Printf("日志路径: %s\n", logPath)
    fmt.Printf("检查间隔: %v\n", checkInterval)
    fmt.Printf("日志分析间隔: %v\n", logCheckInterval)
}

高级用法

1. 指定.env 文件路径

// 加载自定义路径的 env 文件
godotenv.Load("/path/to/config/.env")
// 或多个文件
godotenv.Load(".env.local", ".env")

2. 仅加载,不覆盖已有环境变量

// 如果系统已有 DINGTALK_TOKEN,则不会被 .env 覆盖
godotenv.Load()

godotenv.Load() 默认行为: 只设置未定义的环境变量 ,安全!

3. 强制覆盖(谨慎使用)

// 覆盖已有环境变量
_ = godotenv.OverLoad()

4. 读取为 map(不注入环境变量)

envMap, err := godotenv.Read()
if err != nil {
    log.Fatal(err)
}
fmt.Println(envMap["DINGTALK_TOKEN"])

安全建议

  1. 永远不要提交 .env 到 Git
# .gitignore
.env
.env.local
*.env
  1. 生产环境优先使用系统环境变量
  • 在 Docker / Kubernetes / 云服务器中,直接通过 -e 或 Secret 注入
  • .env 仅用于本地开发
  1. 敏感信息不要硬编码
    • 即使在 .env 中,也要确保文件权限安全( chmod 600 .env