Golang中如何加载.env环境变量

Golang中如何加载.env环境变量 我正在尝试使用以下代码加载 .env 变量:

dbConn := os.Getenv("DB")
fmt.Println("DB": , dbConn)

但这不起作用,我该如何加载变量?

5 回复

你好,我可以直接从 .env 文件中读取它们吗? 为什么我必须设置它们?

更多关于Golang中如何加载.env环境变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您可以读取任何您喜欢的文件,但这并非环境变量的意义所在。环境变量 - 维基百科

.env(“dotenv”)文件似乎是相对较新的东西,Go 语言并未内置对其的支持。你需要找到一个第三方库来读取你的 dotenv 文件并将其数据加载到进程的环境变量中,例如 joho/godotenv: A Go port of Ruby’s dotenv library (Loads environment variables from .env.) (github.com)

对我有效(注意我修复了冒号在引号外的错误):

C:\path>type printenvvar.go
package main

import (
        "fmt"
        "os"
)

func main() {
        dbConn := os.Getenv("DB")
        fmt.Println("DB:", dbConn)
}

C:\path>set DB=db from env

C:\path>go run printenvvar.go
DB: db from env

在Go中直接使用os.Getenv()只能读取系统环境变量,要加载.env文件需要使用第三方库。以下是两种常用方法:

1. 使用github.com/joho/godotenv(推荐)

package main

import (
    "fmt"
    "log"
    "os"
    "github.com/joho/godotenv"
)

func main() {
    // 加载.env文件
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }
    
    // 现在可以读取环境变量
    dbConn := os.Getenv("DB")
    fmt.Println("DB:", dbConn)
    
    // 也可以指定文件路径
    // godotenv.Load(".env.local", ".env")
}

2. 使用github.com/caarlos0/env(支持结构体绑定)

package main

import (
    "fmt"
    "log"
    "github.com/caarlos0/env/v10"
    "github.com/joho/godotenv"
)

type Config struct {
    DB      string `env:"DB,required"`
    Port    int    `env:"PORT" envDefault:"8080"`
    Debug   bool   `env:"DEBUG" envDefault:"false"`
}

func main() {
    // 先加载.env文件
    if err := godotenv.Load(); err != nil {
        log.Printf("Warning: .env file not found")
    }
    
    var cfg Config
    if err := env.Parse(&cfg); err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("DB: %s\n", cfg.DB)
    fmt.Printf("Port: %d\n", cfg.Port)
}

3. 自定义简单实现

如果不想引入依赖,可以自己实现:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func loadEnvFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close()
    
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        if len(line) == 0 || line[0] == '#' {
            continue
        }
        
        parts := strings.SplitN(line, "=", 2)
        if len(parts) == 2 {
            key := strings.TrimSpace(parts[0])
            value := strings.TrimSpace(parts[1])
            os.Setenv(key, value)
        }
    }
    return scanner.Err()
}

func main() {
    if err := loadEnvFile(".env"); err != nil {
        fmt.Println("Warning:", err)
    }
    
    dbConn := os.Getenv("DB")
    fmt.Println("DB:", dbConn)
}

安装godotenv:

go get github.com/joho/godotenv

.env文件示例:

DB=postgres://user:password@localhost:5432/dbname
PORT=8080
DEBUG=true

第一种方法最常用,godotenv库稳定且维护良好。

回到顶部