前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[golang] 环境变量操纵与踩过的坑

[golang] 环境变量操纵与踩过的坑

作者头像
老麦
发布2022-12-24 09:40:46
7970
发布2022-12-24 09:40:46
举报
文章被收录于专栏:Go与云原生Go与云原生

golang 中的环境变量操作都在 os 包下面, 只有很少的几个, 而且字面意思也很明确。

  1. 所有环境变量操作对象都是 字符串 (string), 因此对于 int, bool 类型需要自己实现转换。
  2. golang 程序执行的时候, 是在 linux 系统中 fork 的一种子进程中
    1. golang程序 在 复制了 fork 时 (开始运行的那一瞬间)的所有变量, 之后的父进程中的变量变化不再影响 golang 程序。
    2. golang 程序对环境变量的所有操作,都是在自身的子进程中,因此 只会影响 golang 程序本身。
    3. go 语言中没有类似 bash 中的 export 的操作。

os.Setenv("key","val")

创建一个环境变量

os.Unsetenv("key")

取消一个变量

val=os.Getenv("key")

返回一个变量的值。如果变量不存在, val 为空字符串。 len(val)==0

val,ok=os.LookupEnv("key")

返回一个变量的值 与 变量是否存在的 bool 结果。

  • 如果变量存在, val 为值, ok 为 true
  • 如果变量不存在, val 为空字符串, ok 为 false

注意, 变量不存在 (ok=true), 和 变量值为空 (ok=false) 不一样

os.Clearenv()

清空所有变量。

envs=os.Environ()

返回包含所有变量的 []string 切片 副本 。

由于 os.Environ() 返回的是一个 []string 切片, 在某些场景下, 如果要进行 传递并检索 的时候, 并不是很方便, 因此会有需求转换成 map[string]string

在这里, 需要额外小心, 如果在转换时使用了 strings.Split 而没有使用 strings.Join 可能会造成数据丢失。

因为以下语句是合法的。

代码语言:javascript
复制
VAR=key1=val1,key2=val2

例如下面这段代码, envutils - fix: lost value when trans env string slice into map

代码语言:javascript
复制
	_ = os.Setenv("VAR", "key=val1,key2=val2")
	m := make(map[string]string)
	envs := os.Environ()

	for _, pair := range envs {
		kv := strings.Split(pair, "=")
    // m[kv[0]] = kv[1:] // wrong: VAR=key1 与实际情况不符合
		m[kv[0]] = strings.Join(kv[1:], "=")  // 注意这里要使用 Join
	}

os.ExpandEnv("string") or os.Expand("string",os.Getenv)

如果 string 中包含 key 或者 {key} 的 占位符 , 则将被替换为实际的值。就是 bash 中的变量用法。

代码语言:javascript
复制
func Test_ExpandEnv(t *testing.T) {
  
	_ = os.Setenv("MY_Age", "18")
	_ = os.Setenv("MY_Name", "Zhangsan")

	result := os.ExpandEnv("my name is ${MY_Name}, i'm $MY_age years old")
	fmt.Println(result) // my name is Zhangsan, i'm  years old
}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • os.Setenv("key","val")
  • os.Unsetenv("key")
  • val=os.Getenv("key")
  • val,ok=os.LookupEnv("key")
  • os.Clearenv()
  • envs=os.Environ()
  • os.ExpandEnv("string") or os.Expand("string",os.Getenv)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档