golang-envutils

「Golang 反射实战」 - 我用 Golang 反射写了一个配置库 - envutils , 应用再也不会少变量了

用习惯了 struct 之后, 我想所有东西都通过 struct 管理。 学习了反射之后, 我总要找点事情做来练习。

于是我整合了 Golang环境变量操作Golang反射, 以及解决了我认为的其他一些配置管理的痛点, 便有了这个项目。

配置管理的痛点

struct

以及一些其他的小地方

于是, 为了解决以上几个痛点, 我自己造了一个轮子。 这个轮子支持

map

实现效果

1. 序列化配置

SetDefaults()
type MysqlServer struct {
    ListenAddr string `env:"listenAddr"`
    Auth       string `env:"auth"`
    DBName     string `env:"dbName"`
}

func (my *MysqlServer) SetDefaults() {
    if my.ListenAddr == "" {
        my.ListenAddr = "localhost:3306"
    }
}

type RedisServer struct {
    DSN string `env:"dsn"`
}

func (r *RedisServer) SetDefaults() {
    if r.DSN == "" {
        r.DSN = "redis://:Password@localhost:6379/0"
    }
}
configCallSetDefaults
func Test_ConfP_Server(t *testing.T) {

// 1. 创建配置结构体
    config := &struct {
        MysqlServer *MysqlServer
        RedisServer *RedisServer
    }{
        MysqlServer: &MysqlServer{},
        RedisServer: &RedisServer{},
    }

// 2. 调用设置默认值
    err := CallSetDefaults(config)
    if err != nil {
        panic(err)
    }

// 3. 序列化配置
    data, err := Marshal(config, "AppName")
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s\n", data)
}

2. 反序列化配置

default.ymlconfig.yml
AppName__MysqlServer_auth: "DbUser:DbPass"
AppName__MysqlServer_dbName: "default_db"
AppName__MysqlServer_listenAddr: 100.100.100.100:3306
AppName__RedisServer_dsn: redis://:YouPass@redis.example.com:6379/0
UnmarshalFile
func Test_ConfP_Server(t *testing.T) {

    config := &struct {
        MysqlServer *MysqlServer
        RedisServer *RedisServer
    }{
        MysqlServer: &MysqlServer{},
        RedisServer: &RedisServer{},
    }

    err := UnmarshalFile(config, "AppName", "config.yml")
    if err != nil {
        panic(err)
    }

    fmt.Println("my_auth =>", config.MysqlServer.Auth)
    fmt.Println("redis_dsn =>", config.RedisServer.DSN)
}

输出结果与 config 配置一致。

my_auth => DbUser:DbPass
redis_dsn => redis://:YouPass@redis.example.com:6379/0

补充说明

string, int, uint, bool

互相吹捧, 共同进步

欢迎和我一起学习进步, 如果有什么问题, 可以给我私信留言。 或者