大家好, 我是老麦, 我将每天 早上9点 为你分享一篇好文章。
原文链接:https://tangx.in/posts/2021/09/06/golang-os-env-operation/
golang 中的环境变量操作都在 os
包下面, 只有很少的几个方法, 而且字面意思也很明确。
string
, 因此对于 int, bool 类型需要自己实现转换。export
的操作。但是可以通过 os.Setenv
设置环境变量。image-20210907001155092
os.Setenv("key","val")
创建一个环境变量
os.Unsetenv("key")
取消一个变量
val=os.Getenv("key")
返回一个变量的值。如果变量不存在, val 为空字符串。
len(val)==0
这种方法无法区分变量不存在或者变量值为空字符串。
val,ok=os.LookupEnv("key")
返回一个变量的值 与 变量是否存在的 bool 结果。
true
false
注意, 变量不存在
(ok=false)
, 和 变量值为空(ok=true)
不一样
os.Clearenv()
清空所有变量。危险 慎用。
envs=os.Environ()
返回包含所有变量的 []string
切片 副本 。
由于 os.Environ()
返回的是一个 []string
切片, 在某些场景下, 如果要进行 传递并检索 的时候, 并不是很方便, 因此会有需求转换成 map[string]string
。
在这里 需要额外小心, 如果想通过使用了 strings.Split
分割 **等号=
**以获取变量名和值,但是变量值没有使用 strings.Join
合并时, 可能会造成数据丢失。 有点拗口,看例子
因为一下语句时合法的
VAR=key1=val1,key2=val2
这句话赋值语句表示将 字符串 key1=val1,key2=val2
赋值给 变量 VAR
例如下面这段代码, envutils - fix: lost value when trans env string slice into map[1]
_ = 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
中的变量用法。
func Test_ExpandEnv(t *testing.T) {
_ = os.Setenv("MY_Age", "18")
_ = os.Setenv("MY_Name", "Zhangsan")
// MY_age 大小写不匹配。
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
}
欢迎 关注公众号 Go与云原生
或 订阅网站 https://tangx.in/
。
觉得好的话,请猛击文章「转发, 点赞,在看」,感谢支持
[1] envutils - fix: lost value when trans env string slice into map: https://github.com/tangx/envutils/commit/ca10e1c057193283ef308ae708ef421de3d1ec1b
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。