diff --git a/26-data/data/database.go b/26-data/data/database.go index 9e7a0bd..02fae5f 100644 --- a/26-data/data/database.go +++ b/26-data/data/database.go @@ -41,28 +41,28 @@ func scanIntoStruct(rows *sql.Rows, target interface{}) (results interface{}, er colNames, _ := rows.Columns() colTypes, _ := rows.ColumnTypes() references := []interface{}{} - fieldVal := reflect.Value{} var placeholder interface{} for i, colName := range colNames { Printfln("Column: %s", colName) - // 获取字段值 + // 获取字段 colNameParts := strings.Split(colName, ".") - fieldVal = targetVal.FieldByName(colNameParts[0]) - if fieldVal.IsValid() && fieldVal.Kind() == reflect.Struct && len(colNameParts) > 1 { + field := targetVal.FieldByName(colNameParts[0]) + if field.IsValid() && field.Kind() == reflect.Struct && len(colNameParts) > 1 { for _, namePart := range colNameParts[1:] { comFunction := matchColName(namePart) - fieldVal = fieldVal.FieldByNameFunc(comFunction) + field = field.FieldByNameFunc(comFunction) } } - // 判断是否可以转换 - if !fieldVal.IsValid() || !colTypes[i].ScanType().ConvertibleTo(fieldVal.Type()) { + if !field.IsValid() || !colTypes[i].ScanType().ConvertibleTo(field.Type()) { + // 字段不存在或者不可以转换 Printfln("Column placeholder: %s", colName) references = append(references, &placeholder) - } else if fieldVal.Kind() != reflect.Ptr && fieldVal.CanAddr() { + } else if field.Kind() != reflect.Ptr && field.CanAddr() { + // 字段存在并且可以转换,不为指针并且可以获取到地址 Printfln("Column Addr: %s", colName) - fieldVal = fieldVal.Addr() - references = append(references, fieldVal.Interface()) + field = field.Addr() + references = append(references, field.Interface()) } } @@ -73,6 +73,7 @@ func scanIntoStruct(rows *sql.Rows, target interface{}) (results interface{}, er if err != nil { break } + // 将指针转换为结构体,从而可以复制该结构体,并增加到切片中 resultSlice = reflect.Append(resultSlice, targetVal) } results = resultSlice.Interface()