package util import ( "encoding/json" "errors" "io/ioutil" "os" "strings" "sync" ) var lock sync.Mutex //读取配置文件,可以有2个参数, //第一个参数是配置文件路径,如果只有一个参数时,默认配置文件路径为./config.json //第二个参数是要注入的对象,可以是结构体,或者是interface对象 func ReadConfig(config ...interface{}) { var r *os.File if len(config) > 1 { filepath, _ := config[0].(string) println(filepath) r, _ = os.Open(filepath) defer r.Close() bs, _ := ioutil.ReadAll(r) json.Unmarshal(bs, config[1]) } else { r, _ = os.Open("./config.json") defer r.Close() bs, _ := ioutil.ReadAll(r) json.Unmarshal(bs, config[0]) } } //程序修改SysConfig配置表后,调用写入配置文件 func WriteSysConfig(config ...interface{}) { var r *os.File var configobj interface{} if len(config) > 1 { filepath, _ := config[0].(string) r, _ = os.OpenFile(filepath, os.O_WRONLY|os.O_TRUNC, 0x644) configobj = config[1] } else { r, _ = os.OpenFile("./config.json", os.O_WRONLY|os.O_TRUNC, 0x644) configobj = config[0] } defer r.Close() if s, ok := configobj.(string); ok { r.Write([]byte(s)) } else { bs, _ := json.Marshal(configobj) r.Write(bs) } } //按路径查map配置 //TODO 暂未处理查询路径中是数组的情况 func GetPropertie(qpath /*map的查询路径*/ string, config map[string]interface{}) (ret interface{}) { //tmp := new(map[string]interface{}) tmp := config qps := strings.Split(qpath, ".") length := len(qps) for i, v := range qps { if v1, ok := tmp[v]; ok { //log.Println("类型:", reflect.TypeOf(v1)) if v2, ok2 := v1.(map[string]interface{}); ok2 { tmp = v2 } else if i == length-1 { //map断了,没有下一层了 ret = v1 } } else { return nil } } return } //设置值 //TODO 未处理数组,仅处理map递归型 func SetPropertie(qpath string, value interface{}, config map[string]interface{}) (err error) { tmp := config qps := strings.Split(qpath, ".") length := len(qps) for i := 0; i < length-1; i++ { if v1, ok1 := (tmp[qps[i]]).(map[string]interface{}); ok1 { tmp = v1 } else { err = errors.New("路径查找失败") break } } if err == nil { tmp[qps[length-1]] = value } return }