社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
env目录下有两个文件,其中一个是测试文件,还有一个env.go文件,这个文件包括注释等其他内容大概在80行代码左右。
这个文件里引用了一个github.com/astaxie/beego/utils这个包,使用到了utils.NewBeeMap()这个内容,所以准备分析下NewBeeMap函数内容,这个函数在github.com/astaxie/beego/utils/safemap.go里面,这个函数以及涉及到的内容。
从这个文件的代码可以看出,这个文件里的代码实现了线程安全map操作,在go1.9之前没有为map没有提供协程安全,go1.9之后官网提供了协程安全的操作sync.Map,这个文件实现的功能类似sync.Map的操作。
env.go文件里有一个init函数
var env *utils.BeeMap
func init() {
env = utils.NewBeeMap()
for _, e := range os.Environ() {
splits := strings.Split(e, "=")
env.Set(splits[0], os.Getenv(splits[0]))
}
}
从上面代码可以知道,是内部全局变量分配内存,然后读取系统环境变量,然后将其存储在env文件里。
然后剩下的内容是可以提供给开发者使用的5个函数,因为是使用BeeMap,也就是实现了协程安全的。
1)func Get(key string, defVal string) string
根据key值获取对应的环境变量值,如果不存在,则返回传入的默认值。
func Get(key string, defVal string) string {
if val := env.Get(key); val != nil {
return val.(string)
}
return defVal
}
2)func MustGet(key string) (string, error)
和Get方法基本一致,根据key值获取对应的环境变量值,如果不存在对应的环境变量值,则返回错误信息
func MustGet(key string) (string, error) {
if val := env.Get(key); val != nil {
return val.(string), nil
}
return "", fmt.Errorf("no env variable with %s", key)
}
3)func Set(key string, value string)
设置环境变量值
func Set(key string, value string) {
env.Set(key, value)
}
4)func MustSet(key string, value string) error
修改信息到环境变量,和上一个Set方法相比,这个函数会强制进行修改。
func MustSet(key string, value string) error {
err := os.Setenv(key, value)
if err != nil {
return err
}
env.Set(key, value)
return nil
}
5)func GetAll() map[string]string
获取全部环境变量值
func GetAll() map[string]string {
items := env.Items()
envs := make(map[string]string, env.Count())
for key, val := range items {
switch key := key.(type) {
case string:
switch val := val.(type) {
case string:
envs[key] = val
}
}
}
return envs
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!