「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"
}
}configCallSetDefaultsfunc 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.ymlAppName__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/0UnmarshalFilefunc 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互相吹捧, 共同进步
欢迎和我一起学习进步, 如果有什么问题, 可以给我私信留言。 或者