

golang-envutils
原文链接: https://tangx.in/posts/2023/01/27/golang-envutils-config/
用习惯了 struct 之后, 我想所有东西都通过 struct 管理。学习了反射之后, 我总要找点事情做来练习。
于是我整合了 Golang环境变量操作 和 Golang反射, 以及解决了我认为的其他一些配置管理的痛点, 便有了这个项目。
Github 仓库: https://github.com/tangx/envutils
struct 中, 但是如何把 环境变量名称 和 配置结构体 关联起来?以及一些其他的小地方
于是, 为了解决以上几个痛点, 我自己造了一个轮子。这个轮子支持
map, 以保存到文件中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"
}
}
config 结构体组合起来, 并通过 CallSetDefaults 初始化默认值。最后序列化成字符串。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)
}
default.yml 并另存为 config.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 几种基础数据类型。