// Package config ... // // Description : config ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-11-05 16:23 package config import ( "errors" "fmt" "git.zhangdeman.cn/zhangdeman/serialize" "github.com/jessevdk/go-flags" "github.com/joho/godotenv" "github.com/spf13/viper" "reflect" ) // InitByViper 通过viper库初始化配置 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:44 2024/11/7 // // 配置解析优先级 : 显示的值设置 > 命令行标记 > 环境变量 > 配置文件 > 键值存储 > 默认值 // // 参数: // - configReceiver 接收参数结果的指针 // - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件 // - configFilePath 配置文件目录 // - configFileNameList 要加载的配置文件列表 func InitByViper(configReceiver any, envFileList []string, configFilePath string, configFileNameList []string) error { // 解析配置 if err := viper.ReadInConfig(); nil != err { return err } // 获取全部配置,并解析 if err := serialize.JSON.Transition(viper.AllSettings(), configReceiver); nil != err { return err } return nil } // Init 初始化配置 // // Author : go_developer@163.com<白茶清欢> // // Date : 16:25 2024/11/5 // // 参数: // - configReceiver 接收参数结果的指针 // - envFileList 环境变量文件路径, 可以指定多个环境变量文件, 不指定默认加载服务运行目录下 .env 文件 // - configFile 配置文件路径 func Init(configReceiver any, envFileList []string, configFile string) error { var ( err error fileConfigMap = map[string]any{} ) if nil == envFileList { envFileList = make([]string, 0) } // 检查结构体指针是否合法 if err = checkConfigReceiver(configReceiver); err != nil { return err } // 加载环境变量 if err = godotenv.Load(envFileList...); nil != err { return err } // 解析命令行参数 if _, err = flags.Parse(configReceiver); nil != err { return err } // 读取配置文件内容 if err = serialize.File.ReadAnyFileContent(configFile, &fileConfigMap); nil != err { return err } // 解析配置文件参数 configTypeReflect := reflect.TypeOf(configReceiver).Elem() configValueReflect := reflect.ValueOf(configReceiver).Elem() configFieldNum := configValueReflect.NumField() for i := 0; i < configFieldNum; i++ { fmt.Println(configTypeReflect.Field(i).Name) } return nil } // checkConfigReceiver 校验配置接收者必须是指针 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:16 2024/11/5 func checkConfigReceiver(configReceiver any) error { if nil == configReceiver { return errors.New("config receiver is nil") } receiverType := reflect.TypeOf(configReceiver) if receiverType.Kind() != reflect.Ptr { return errors.New("config receiver is not a pointer") } return nil } // cloneReceiver ... // // Author : go_developer@163.com<白茶清欢> // // Date : 17:16 2024/11/5 func cloneReceiver(configReceiver any) any { dataType := reflect.TypeOf(configReceiver).Elem() return reflect.New(dataType).Interface() }