[golang] 环境变量操纵与踩过的坑
2023-02-18 16:39:39 时间
golang 中的环境变量操作都在 os
包下面, 只有很少的几个, 而且字面意思也很明确。
- 所有环境变量操作对象都是 字符串 (string), 因此对于 int, bool 类型需要自己实现转换。
- golang 程序执行的时候, 是在 linux 系统中 fork 的一种子进程中
- golang程序 在 复制了 fork 时 (开始运行的那一瞬间)的所有变量, 之后的父进程中的变量变化不再影响 golang 程序。
- golang 程序对环境变量的所有操作,都是在自身的子进程中,因此 只会影响 golang 程序本身。
- 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
可能会造成数据丢失。
因为以下语句是合法的。
VAR=key1=val1,key2=val2
例如下面这段代码, envutils - fix: lost value when trans env string slice into map
_ = 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")
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语言圣经-字节切片与字符串
- [日常] Linux下vim的常用命令总结
- [日常] Go语言圣经-Goroutines和线程
- [日常] Go语言圣经-并发的非阻塞缓存
- [日常] Go语言圣经-竞争条件习题
- [日常] Go语言圣经-示例: 并发的目录遍历习题
- [日常] Go语言圣经-基于select的多路复用习题
- [日常] Go语言圣经--并发的web爬虫
- [日常] Go语言圣经--并发的循环习题
- [日常] Go语言圣经--Channel习题
- [日常] Go语言圣经--示例: 并发的Echo服务
- [日常] Go语言圣经--示例: 并发的Clock服务习题
- [日常] Go语言圣经--接口约定习题2
- [日常] Go语言圣经--接口约定习题
- [日常] Linux下的docker实践
- [日常] Go语言圣经-指针对象的方法-bit数组习题2
- [日常] Go语言圣经-指针对象的方法-bit数组习题
- [日常] Go语言圣经-Panic异常,Recover捕获异常习题
- [日常] Go语言圣经-Deferred函数
- [日常] Go语言圣经-可变参数习题