以及一些其他的小地方,于是, 为了解决以上几个痛点, 我自己造了一个轮子。 这个轮子支持将 配置结构体 转成一个 有规则的key 的 map, 以保存到文件中,通过读取 配置文件 或者 环境变量 重新将值 映射 到 配置结构体 中。支持 应用名称前缀 , 方便在多应用环境区分。支持 默认值 , 减少多配置文件是的工作量。
/* 堆代码 www.duidaima.com */ 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" } }随后再将需要的依赖库中的配置通过 config 结构体组合起来, 并通过 CallSetDefaults 初始化默认值。 最后序列化成字符串。
func Test_ConfP_Server(t * testing.T) { // 堆代码 www.duidaima.com // 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) }
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补充说明: