package main import ( "bufio" "errors" "io" "io/ioutil" "reflect" "strconv" "strings" //"io/ioutil" "os" //"strings" "fmt" )
type config struct{ Redis redisconfig `ini:"redis"` Mysql mysqlconfig `ini:"mysql"` } type redisconfig struct{ Host string `ini:"host"` Port int `ini:"port"` Password string `ini:"password"` } type mysqlconfig struct{ Host string `ini:"host"` Port int `ini:"port"` }
func loadinit1(fileName string,conf interface{})error{ v := reflect.ValueOf(conf) // 指针类型数据 需要使用 Elem() 方法 if v.Elem().Kind() != reflect.Struct { return errors.New("请传入一个指针的类型结构体变量") } t := v.Type() if t.Kind() != reflect.Ptr { err := errors.New("参数错误1") return err } b,err :=ioutil.ReadFile(fileName) if err != nil{ return err } data :=strings.Split(string(b),"\n") var structName string for _,line := range data{ if len(line) == 0{ continue } line = strings.TrimSpace(line) if strings.HasPrefix(line,";") || strings.HasPrefix(line,"#"){ continue } if(line[0] == '['){ if line[len(line)-1] !=']' || len(line) <=1{ err := errors.New("段错误2") return err } sectionName := line[1:len(line)-1] for i := 0; i < t.Elem().NumField(); i++ { field := t.Elem().Field(i) if sectionName == field.Tag.Get("ini"){ structName = field.Name } } } else{ if strings.Index(line,"=") == -1 || strings.HasPrefix(line,"="){ err := errors.New("数据格式错误3") return err } structObj := v.Elem().FieldByName(structName) if structObj.Kind() != reflect.Struct{ err := errors.New("不是结构体4") return err } para := strings.Split(line,"=") var filedName string stype := structObj.Type() for i:=0;i<stype.NumField();i++{ field := stype.Field(i) if field.Tag.Get("ini") == para[0]{ filedName = field.Name fieldObj := structObj.FieldByName(filedName) switch field.Type.Kind(){ case reflect.String: fieldObj.SetString(para[1]) case reflect.Int: valint,err := strconv.ParseInt(para[1],10,64) if err != nil{ return err } fieldObj.SetInt(valint) } break } } } } return nil } func main(){ con :=config{} err :=loadinit1("/Users/admin/code/goproject/src/go_code/basic/string/reflect.ini",&con) if err != nil{ fmt.Println(err) } fmt.Println(con) }