瀏覽代碼

form mapping optimisation

Manu Mtz-Almeida 10 年之前
父節點
當前提交
967e62337a
共有 1 個文件被更改,包括 13 次插入10 次删除
  1. 13 10
      binding/form_mapping.go

+ 13 - 10
binding/form_mapping.go

@@ -20,18 +20,21 @@ func mapForm(ptr interface{}, form map[string][]string) error {
 			continue
 		}
 
-		// support for embeded fields
-		if structField.Kind() == reflect.Struct {
-			err := mapForm(structField.Addr().Interface(), form)
-			if err != nil {
-				return err
-			}
-			continue
-		}
-
+		structFieldKind := structField.Kind()
 		inputFieldName := typeField.Tag.Get("form")
 		if inputFieldName == "" {
 			inputFieldName = typeField.Name
+
+			// if "form" tag is nil, we inspect if the field is a struct.
+			// this would not make sense for JSON parsing but it does for a form
+			// since data is flatten
+			if structFieldKind == reflect.Struct {
+				err := mapForm(structField.Addr().Interface(), form)
+				if err != nil {
+					return err
+				}
+				continue
+			}
 		}
 		inputValue, exists := form[inputFieldName]
 		if !exists {
@@ -39,7 +42,7 @@ func mapForm(ptr interface{}, form map[string][]string) error {
 		}
 
 		numElems := len(inputValue)
-		if structField.Kind() == reflect.Slice && numElems > 0 {
+		if structFieldKind == reflect.Slice && numElems > 0 {
 			sliceOf := structField.Type().Elem().Kind()
 			slice := reflect.MakeSlice(structField.Type(), numElems, numElems)
 			for i := 0; i < numElems; i++ {