0Pricing
Go Academy · 课时

环境变量

从环境变量覆盖配置

环境变量 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

为什么使用环境变量

十二要素应用方法论建议将配置存储在环境中。环境变量让同一个二进制程序可以在开发、预发布和生产环境中表现不同,而无需修改文件。

Viper 可以在文件配置之上叠加环境变量。

优先级顺序

Viper 会按优先级顺序(从高到低)检查来源,以解析一个键:

  • 显式的 Set 调用
  • 标志
  • 环境变量
  • 配置文件
  • 默认值

因此,环境变量会覆盖文件中的值,但优先级低于显式的 Set。

启用环境变量支持

viper.AutomaticEnv() 会告诉 Viper:对于您请求的任何键,都要检查环境变量。启用后,viper.GetString("port") 会读取 PORT 环境变量。

viper.AutomaticEnv()
port := viper.GetString("port")

添加前缀

为了避免与无关的环境变量冲突,请设置前缀:

  • viper.SetEnvPrefix("myapp")
  • 此时,键 port 会映射到环境变量 MYAPP_PORT

Viper 会将键转换为大写,并在前缀与键之间添加下划线。

viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetString("port")) // reads MYAPP_PORT

处理嵌套键

环境变量不能包含点号。请使用键替换器将点号键映射为下划线,因此 server.port 会变成 SERVER_PORT。

replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.AutomaticEnv()
// server.port -> SERVER_PORT

绑定单个变量

您可以不使用自动模式,而是通过 viper.BindEnv 显式绑定一个键。当环境变量名称不遵循您的前缀约定时,这非常有用。

viper.BindEnv("id", "ACCOUNT_ID")
fmt.Println(viper.GetString("id"))

标准库 os 包

在底层,这会从进程环境中读取值;标准库通过 os.Getenv 和 os.LookupEnv 提供这项功能。

  • os.Getenv 在变量未设置时返回空字符串
  • os.LookupEnv 返回第二个布尔值,告诉您该变量是否存在
val, ok := os.LookupEnv("PORT")
if !ok {
    val = "8080" // default
}

在 Go 中设置环境变量

您可以使用 os.Setenv 以编程方式为测试或默认值设置环境变量。接下来我们正是使用这种方式演示覆盖行为。

os.Setenv("MYAPP_PORT", "9090")

空值与未设置

请注意:设置为空字符串的环境变量仍然存在。os.LookupEnv 会返回 ("", true)。如果只使用 os.Getenv,就无法区分空值和未设置;对于类似布尔值的标志来说,这一点很重要。

os.Setenv("FEATURE", "")
v, ok := os.LookupEnv("FEATURE")
fmt.Println(v == "", ok) // true true

组合起来(概念)

典型的启动流程是:读取文件以获得默认值,然后调用 AutomaticEnv,让部署环境变量拥有更高优先级。运维人员可以修改 MYAPP_PORT,而无需触碰 YAML 文件。

viper.SetConfigName("config")
viper.ReadInConfig()
viper.SetEnvPrefix("myapp")
viper.AutomaticEnv()
fmt.Println(viper.GetInt("port"))

可运行示例:环境变量覆盖

这个标准库程序模拟 Viper 的优先级:先使用文件默认值,再由环境变量覆盖。

package main

import (
    "fmt"
    "os"
)

func get(key, fileDefault string) string {
    if v, ok := os.LookupEnv(key); ok {
        return v
    }
    return fileDefault
}

func main() {
    os.Setenv("PORT", "9090")
    fmt.Println("port:", get("PORT", "8080"))
    fmt.Println("host:", get("HOST", "localhost"))
}

快速检查

测试您对环境变量配置的理解。

回顾

您学会了从环境中覆盖配置:

  • 环境变量在 Viper 的优先级中处于较高位置,高于文件
  • AutomaticEnv + SetEnvPrefix 会将键映射到 PREFIX_KEY
  • 对嵌套的点号键使用 SetEnvKeyReplacer
  • 标准库通过 os.Getenv / os.LookupEnv 提供底层支持

常见问题解答

「环境变量」课时是免费的吗?

是的 — 「环境变量」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「环境变量」这节课中我会学到什么?

从环境变量覆盖配置 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「环境变量」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 读取配置文件
  2. 环境变量
  3. 默认值与监听
  4. 绑定到结构体
← 返回 Go Academy