瀏覽代碼

Refactor convert & assign code.

Add convertAssignValue and use everywhere that convertAssignInt and
cnvertAssignBytes are used.
Gary Burd 11 年之前
父節點
當前提交
1535d06d7b
共有 1 個文件被更改,包括 23 次插入37 次删除
  1. 23 37
      redis/scan.go

+ 23 - 37
redis/scan.go

@@ -95,25 +95,29 @@ func convertAssignInt(d reflect.Value, s int64) (err error) {
 	return
 }
 
-func convertAssignValues(d reflect.Value, s []interface{}) (err error) {
+func convertAssignValue(d reflect.Value, s interface{}) (err error) {
+	switch s := s.(type) {
+	case []byte:
+		err = convertAssignBytes(d, s)
+	case int64:
+		err = convertAssignInt(d, s)
+	default:
+		err = cannotConvert(d, s)
+	}
+	return err
+}
+
+func convertAssignValues(d reflect.Value, s []interface{}) error {
 	if d.Type().Kind() != reflect.Slice {
 		return cannotConvert(d, s)
 	}
 	ensureLen(d, len(s))
 	for i := 0; i < len(s); i++ {
-		switch s := s[i].(type) {
-		case []byte:
-			err = convertAssignBytes(d.Index(i), s)
-		case int64:
-			err = convertAssignInt(d.Index(i), s)
-		default:
-			err = cannotConvert(d, s)
-		}
-		if err != nil {
-			break
+		if err := convertAssignValue(d.Index(i), s[i]); err != nil {
+			return err
 		}
 	}
-	return
+	return nil
 }
 
 func convertAssign(d interface{}, s interface{}) (err error) {
@@ -350,6 +354,10 @@ func ScanStruct(src []interface{}, dest interface{}) error {
 	}
 
 	for i := 0; i < len(src); i += 2 {
+		s := src[i+1]
+		if s == nil {
+			continue
+		}
 		name, ok := src[i].([]byte)
 		if !ok {
 			return errors.New("redigo: ScanStruct key not a bulk string value")
@@ -358,19 +366,7 @@ func ScanStruct(src []interface{}, dest interface{}) error {
 		if fs == nil {
 			continue
 		}
-		f := d.FieldByIndex(fs.index)
-		var err error
-		switch s := src[i+1].(type) {
-		case nil:
-			// ignore
-		case []byte:
-			err = convertAssignBytes(f, s)
-		case int64:
-			err = convertAssignInt(f, s)
-		default:
-			err = cannotConvert(f, s)
-		}
-		if err != nil {
+		if err := convertAssignValue(d.FieldByIndex(fs.index), s); err != nil {
 			return err
 		}
 	}
@@ -379,7 +375,6 @@ func ScanStruct(src []interface{}, dest interface{}) error {
 
 var (
 	errScanSliceValue = errors.New("redigo: ScanSlice dest must be non-nil pointer to a struct")
-	errScanSliceSrc   = errors.New("redigo: ScanSlice src element must be bulk string or nil")
 )
 
 // ScanSlice scans src to the slice pointed to by dest. The elements the dest
@@ -411,11 +406,7 @@ func ScanSlice(src []interface{}, dest interface{}, fieldNames ...string) error
 			if s == nil {
 				continue
 			}
-			s, ok := s.([]byte)
-			if !ok {
-				return errScanSliceSrc
-			}
-			if err := convertAssignBytes(d.Index(i), s); err != nil {
+			if err := convertAssignValue(d.Index(i), s); err != nil {
 				return err
 			}
 		}
@@ -457,12 +448,7 @@ func ScanSlice(src []interface{}, dest interface{}, fieldNames ...string) error
 			if s == nil {
 				continue
 			}
-			sb, ok := s.([]byte)
-			if !ok {
-				return errScanSliceSrc
-			}
-			d := d.FieldByIndex(fs.index)
-			if err := convertAssignBytes(d, sb); err != nil {
+			if err := convertAssignValue(d.FieldByIndex(fs.index), s); err != nil {
 				return err
 			}
 		}