beego config模块源码分析笔记五 - Go语言中文社区

beego config模块源码分析笔记五


image.png

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
}
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/69fa40dc03d3
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 11:57:24
  • 阅读 ( 859 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢