package config import ( "fmt" "git.noahlan.cn/northlan/ntools-go/logger" "github.com/knadh/koanf" "github.com/knadh/koanf/parsers/yaml" "github.com/knadh/koanf/providers/file" "github.com/zeromicro/go-zero/zrpc" ) type ( Config struct { // Log 日志配置 Log struct { File logger.FileConfig Console logger.ConsoleConfig } Server struct { Debug bool Listen string } // Kafka 队列配置 Kafka struct { Danmaku Kafka // 发送弹幕 Gift Kafka // 赠送礼物 GuardBuy Kafka // TODO 购买贵族 改名 RewardPool Kafka // 奖池消息 UserCoin Kafka // 用户金币变动消息 } Game struct { // DefaultRooms 默认房间 DefaultRooms []struct { ID int64 // ID GameType string // 类型 } AdminUserId []int64 // 管理员ID Zhg Zhg // 指挥官 // Zhghz 指挥官海战模式 Zhghz struct { } // Zhgfb 指挥官副本模式 Zhgfb struct { } Zhgzd Zhgzd // Zhgzd 指挥官-阵地 Zhgww2 Zhgww2 // Zhgww2 指挥官-二战 Zhgmang Zhgmang // Zhgmang 指挥官-莽 } // RPC UserCenterRpc zrpc.RpcClientConf } Option func(cfg *Config) ) var k = koanf.New(".") var f *file.File func MustLoad(filepath string, opts ...Option) *Config { var cfg Config f = file.Provider(filepath) mustLoadAndUnmarshal(f, &cfg) for _, opt := range opts { opt(&cfg) } fmt.Printf("%+v\n", cfg) return &cfg } func WithHotReload() Option { return func(cfg *Config) { err := f.Watch(func(event interface{}, err error) { if err != nil { fmt.Printf("配置文件热重载失败: %v\n", err) return } k = koanf.New(".") err = loadAndUnmarshal(f, cfg) if err != nil { fmt.Printf("配置文件热重载失败: %v\n", err) return } fmt.Printf("重载配置文件: %+v\n", cfg) }) if err != nil { panic(err) } } } func loadAndUnmarshal(f *file.File, cfg *Config) (err error) { err = k.Load(f, yaml.Parser()) if err != nil { return } err = k.UnmarshalWithConf("", cfg, koanf.UnmarshalConf{Tag: "c"}) if err != nil { return } return } func mustLoadAndUnmarshal(f *file.File, cfg *Config) { if err := loadAndUnmarshal(f, cfg); err != nil { panic(err) } }