/** * 针对字段进行设值 * * @param fieldValue 字段反射对象 * @param fieldName 字段名,以便递归寻找下个设值字段 * @param fieldSplitName 字段名分割集合,以"."进行分割,主要是为了递归子字段进行拼接传递 * @param value 设置值 */ func parampackSetFieldValue(fieldValue reflect.Value, fieldName string, fieldSplitName []string, value interface{}) { if fieldValue.IsValid() { // 为递归下一个参数做准备,保留后面的参数名(tag.TagName) isRec := false joinLaterFieldName := "" if 1 < len(fieldSplitName) { joinLaterFieldName = strings.Join(fieldSplitName[1:], ".") isRec = true // 进入这里表明还需要进行一次字段查询,所以需要进行递归操作,直到截取到最后一位的参数名标识(TagName) } switch fieldValue.Kind() { case reflect.Ptr: if fieldValue.IsNil() { fieldValue.Set(reflect.New(fieldValue.Type().Elem())) } // 指针与非指针区分开,主要是在进行参数设值的时候对应与设置值相同的类型,减免指针的过多操作。 switch fieldValue.Elem().Kind() { case reflect.Struct: if isRec && !parampackFilterParamPackStructType(fieldValue.Type().Elem()) { parampackSetStructFieldValue(fieldValue, joinLaterFieldName, value) } else { parampackSetParamValue(fieldValue, fieldName, value) } case reflect.Slice: // 如果属于切片类型,传递fieldName主要是在操作一遍集合元素的赋值,因为不是结构类型无需再向下查找 parampackSetStructFieldValue(fieldValue, fieldName, value) default: parampackSetParamValue(fieldValue, fieldName, value) } case reflect.Struct: if isRec && !parampackFilterParamPackStructType(fieldValue.Type()) { parampackSetStructFieldValue(fieldValue, joinLaterFieldName, value) } else { // 如果检测的是系统或则非用户定义的struct就可以直接赋值了,赋值那里已经做了匹配类型才进行赋值的处理 parampackSetParamValue(fieldValue, fieldName, value) } case reflect.Slice: parampackSetStructFieldValue(fieldValue, fieldName, value) default: parampackSetParamValue(fieldValue, fieldName, value) } } }