/** * 过滤参数封装一些系统的struct * 在有些设置结构参数时,系统的struct不必要再递归分析 * * @return true 属于过滤字段 false不是过滤的字段 */ func parampackFilterParamPackStructType(valueType reflect.Type) bool { result := true // strings.Index(fieldValue.Type().String(), "multipart.FileHeader") switch valueType.String() { case "[]multipart.FileHeader", "[]*multipart.FileHeader", "*multipart.FileHeader", "multipart.FileHeader": case "": SFLog.Error("can not read type.String() : %v", valueType) default: result = false } return result }
/** * 根据url和form参数信息创建一个struct体,如果存在集合结构会根据form参数信息make分配切片大小。 * * @param structType 需要操作的的结构 * @param urlValues url或form请求参数(主要为了操作slice的创建元素) * @return 返回创建好的函数反射对象信息(指针类型的) */ func parampackNewStructPtr(structType reflect.Type, urlValues url.Values) reflect.Value { // 考虑到结构内包含指针,如果不进行new的话直接(.)会爆出空指针异常,所以这里需要遍历每个对象 if structType.Kind() != reflect.Struct { return reflect.Zero(structType) } structValue := reflect.New(structType) if 0 == len(urlValues) { return structValue } // begin 分析数组 TODO 需要调整集合下的集合 type[0].tmpe[0] arraySizeMap := make(map[string]int) // key = jsonfiledname ,value = array size for k, _ := range urlValues { // 存储(oneUser.hobbys.names)操作的连接名 如果存在集合则存储为key tempJoinName := "" fields := strings.Split(k, ".") for _, field := range fields { fieldLower := strings.ToLower(field) strIndex := _arrayTagRex.FindString(fieldLower) if 0 != len(strIndex) { intIndex, err := strconv.Atoi(strIndex[1 : len(strIndex)-1]) if nil == err { // 这里为key做准备 tempJoinName += fieldLower[:len(fieldLower)-len(strIndex)] // 由于下标是从0开始计算,所以需要+1作为 array size intIndex += 1 if sizeIndex, ok := arraySizeMap[tempJoinName]; ok { if sizeIndex < intIndex { arraySizeMap[tempJoinName] = intIndex } } else { arraySizeMap[tempJoinName] = intIndex } // 由于可能存在数组下还存在集合(temp[0].temp2[0]),所以继续累加"[index]."继续执行。 tempJoinName += strIndex + "." } else { // 进入到这部基本上是获取的 "[ 错误下标 ]" 才导致的,所欲当没有下标出现,继续累加 tempJoinName += fieldLower + "." } } else { tempJoinName += fieldLower + "." } } } // end 分析数组 // 执行递归子字段操作 parampackNewStructFindFiled(structValue, "", arraySizeMap) return structValue }