ZetCode

Go 环境变量

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Golang 中使用环境变量。

环境变量

环境变量是动态命名的值,可以影响计算机上运行进程的行为。它们是进程运行环境的一部分。在软件开发中,环境变量用于配置应用程序。

环境变量的例子包括文件系统中所有可执行文件的位置、默认 shell 和编辑器,或者系统区域设置。

要在 Go 中使用环境变量,我们可以使用 os 包或第三方 godotenvviper 库。

Go os.Getenv

Getenv 检索由键命名的环境变量的值。它返回该值,如果变量不存在,则返回空字符串。要区分空值和未设置值,请使用 LookupEnv

get_env.go
package main

import (
    "fmt"
    "os"
)

func main() {

    fmt.Println("Shell:", os.Getenv("SHELL"))
}

该示例打印当前用户 shell 的名称。

$ go run get_env.go
Shell: /bin/bash

Go os.LookupEnv

LookupEnv 函数检索由键命名的环境变量的值。如果设置了该变量,则返回其值(可能为空),布尔值为 true。否则,返回的值将为空,布尔值为 false。

lookup.go
package main

import (
    "fmt"
    "os"
)

func main() {

    getEnv := func(key string) {
        val, ok := os.LookupEnv(key)
        if !ok {
            fmt.Printf("%s not set\n", key)
        } else {
            fmt.Printf("%s=%s\n", key, val)
        }
    }

    getEnv("EDITOR")
    getEnv("SHELL")
}

在代码示例中,我们尝试获取两个环境变量。如果变量存在,则打印其值;否则,显示该变量未设置的消息。

$ go run lookup.go 
EDITOR not set
SHELL=/bin/bash

Go os.Setenv

os.Setenv 设置由键命名的环境变量的值。

setenv.go
package main

import (
    "fmt"
    "os"
)

func main() {

    fmt.Println("editor:", os.Getenv("EDITOR"))

    os.Setenv("EDITOR", "emacs")

    fmt.Println("editor:", os.Getenv("EDITOR"))
}

在代码示例中,我们使用 os.Setenv 设置了 EDITOR 变量。

Go 列出环境变量

os.Environ 返回一个字符串副本,代表环境变量,格式为“key=value”。

list_env_vars.go
package main

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

func main() {

    for _, e := range os.Environ() {

        pair := strings.SplitN(e, "=", 2)
        fmt.Printf("%s: %s\n", pair[0], pair[1])
    }
}

在代码示例中,我们获取了所有环境变量的列表。我们使用 SplitN 将字符串分割成键值对。

Go os.Expandenv

os.ExpandEnv 是一个帮助函数,它将字符串中的 $var 替换为给定变量的值。对未定义变量的引用将被替换为空字符串。

expandenv.go
package main

import (
    "fmt"
    "os"
)

func main() {

    os.Setenv("EDITOR", "emacs")

    fmt.Println(os.ExpandEnv("My editor is $EDITOR."))
    fmt.Println(os.ExpandEnv("My shell is $SHELL."))

}

该示例展开了两个变量。

$ go run expandenv.go 
My editor is emacs.
My shell is /bin/bash.

Go dotenv 库

在开发机器上,环境变量通常存储在特殊的 .env 文件中。godotenv 库从 .env 文件加载环境变量。

$ go get github.com/joho/godotenv

我们安装该库。

.env
EDITOR=emacs
NAME=Peter

我们有两个变量。

dotenv_load.go
package main

import (
    "fmt"
    "log"
    "os"

    "github.com/joho/godotenv"
)

func init() {

    err := godotenv.Load(".env")

    if err != nil {
        log.Fatal("Error loading .env file")
    }
}

func main() {

    fmt.Printf("%s uses %s\n", os.Getenv("NAME"), os.Getenv("EDITOR"))
}

使用 Load 函数,我们加载变量,然后使用 os.Getenv 检索它们。

如果我们不想将现有环境变量与 .env 文件中的变量混淆,我们可以使用 Read 函数,它返回一个环境变量的 map。

dotenv_read.go
package main

import (
    "fmt"
    "log"

    "github.com/joho/godotenv"
)

func main() {

    var envs map[string]string
    envs, err := godotenv.Read(".env")

    if err != nil {
        log.Fatal("Error loading .env file")
    }

    name := envs["NAME"]
    editor := envs["EDITOR"]

    fmt.Printf("%s uses %s\n", name, editor)
}

在代码示例中,我们将 .env 文件中的环境变量读取到一个 map 中。

来源

Go os 包 - 参考

在本文中,我们学习了如何在 Go 中使用环境变量。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程