From f9ea51b50034dcd1caf27d56255f246f0e22b1d8 Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Tue, 28 Oct 2025 21:28:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(database):=E4=BC=98=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=89=AB=E6=8F=8F=E4=B8=8E=E8=BD=AC=E6=8D=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91-=20=E9=87=8D=E5=91=BD=E5=90=8D=20fieldVal=20=E4=B8=BA?= =?UTF-8?q?=20field=20=E4=BB=A5=E6=8F=90=E9=AB=98=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7-=20=E6=94=B9=E8=BF=9B=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=AD=98=E5=9C=A8=E6=80=A7=E5=92=8C=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=A3=80=E6=9F=A5=E9=80=BB=E8=BE=91=20-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E5=AD=97=E6=AE=B5=E5=A4=84=E7=90=86=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=20-=20=E7=A1=AE=E4=BF=9D=E5=AD=97=E6=AE=B5=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=92=8C=E8=BD=AC=E6=8D=A2=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=20-=20=E6=9B=B4=E6=96=B0=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=93=E5=A4=8D=E5=88=B6=E5=92=8C=E7=BB=93=E6=9E=9C=E5=88=87?= =?UTF-8?q?=E7=89=87=E8=BF=BD=E5=8A=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 26-data/data/database.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) 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()