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
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容