闽公网安备 35020302035485号
以及一些其他的小地方,于是, 为了解决以上几个痛点, 我自己造了一个轮子。 这个轮子支持将 配置结构体 转成一个 有规则的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补充说明: