ini配置
-
逻辑步骤
1.检测传入的结构体是不是指针类型,值类型不能再函数中修改值
2.读取ini文件的内容,并且处理成按行划分的切片
3.遍历切片中每一组数据,分类处理:
3.1 对于非格式化的数据直接报错
3.2 对于[xxxx]标题内容,先判断格式,在读取内容,然后存储结构体名称xxxx
3.3 对于K=V的内容,分别存储key和value,然后先去利用结构体名册读取到对应结构体,再在结构体中找到key’对应的结构体字段,最后对这个字段先判断类型然后赋值
-
实现代码
package main import ( "errors" "fmt" "io/ioutil" "reflect" "strconv" "strings" ) // Mysql配置结构体 type MysqlConfig struct { Address string `ini:"address"` Port int `ini:"port"` Username string `ini:"username"` Password string `ini:"password"` } // Redis配置结构体 type RedisConfig struct { Host string `ini:"host"` Port int `ini:"port"` Password string `ini:"password"` Database int `ini:"database"` Test bool `ini:"test"` } // 嵌套结构,包装所有的类型的配置结构体 type Config struct { MysqlConfig `ini:"mysql"` RedisConfig `ini:"redis"` } func loadIni(fileName string, data interface{ }) (err error) { // 0.参数校验:data必须是结构体指针类型 t := reflect.TypeOf(data) // 检测参数是否是一个指针 if t.Kind() != reflect.Ptr { err = errors.New("data param should be a pointer") return } // 检测指针是否指向结构体 if t.Elem().Kind() != reflect.Struct { err = errors.New("data param should be a struct pointer") return } // 1.读文件获取字节类型的数据 b, err := i