Ejemplo n.º 1
0
/**
 *	过滤参数封装一些系统的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
}
Ejemplo n.º 2
0
/**
 *	根据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
}