diff --git a/scan.go b/scan.go index 54cd6769d..415b9f0d7 100644 --- a/scan.go +++ b/scan.go @@ -274,7 +274,9 @@ func Scan(rows Rows, db *DB, mode ScanMode) { if !update || reflectValue.Len() == 0 { update = false - if !isArrayKind { + if isArrayKind { + db.Statement.ReflectValue.Set(reflect.Zero(reflectValue.Type())) + } else { // if the slice cap is externally initialized, the externally initialized slice is directly used here if reflectValue.Cap() == 0 { db.Statement.ReflectValue.Set(reflect.MakeSlice(reflectValue.Type(), 0, 20)) diff --git a/tests/query_test.go b/tests/query_test.go index e780e3bfe..c0259a14a 100644 --- a/tests/query_test.go +++ b/tests/query_test.go @@ -1409,3 +1409,22 @@ func TestQueryError(t *testing.T) { }, Value: 1}).Scan(&p2).Error AssertEqual(t, err, gorm.ErrModelValueRequired) } + +func TestQueryScanToArray(t *testing.T) { + err := DB.Create(&User{Name: "testname1", Age: 10}).Error + if err != nil { + t.Fatal(err) + } + + users := [2]*User{{Name: "1"}, {Name: "2"}} + err = DB.Model(&User{}).Where("name = ?", "testname1").Find(&users).Error + if err != nil { + t.Fatal(err) + } + if users[0] == nil || users[0].Name != "testname1" { + t.Error("users[0] not covere") + } + if users[1] != nil { + t.Error("users[1] should be empty") + } +}