go version
)؟جولانج 1.8.3
mysql 5.6
يرجى تقديم برنامج كامل قابل للتشغيل لإعادة إظهار مشكلتك.
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
var db *gorm.DB
func find(v *map[string]interface{}) {
}
func main() {
var err error
db, err = gorm.Open("mysql", "***")
if err != nil {
panic(err)
}
var user map[string]interface{}
db.Debug().Table("test").Find(&user)
fmt.Println(user)
}
مثل هذا العرض التوضيحي ، أريد البحث في بعض الصفوف من mysql ، ولا أريد استخدام البنية. Beacuse ، عندما أريد الحصول على نتيجة الانضمام ، أحتاج إلى إنشاء هيكل كبير جديد أو هيكل الحمولة. أعتقد أن الخريطة جيدة في هذا.
هل يمكن لأي شخص مساعدتي؟
لم تقم بتهيئة بنية المستخدم.
حاول تغييره إلى var user = make(map[string]interface{})
.
على الرغم من أنني أعتقد أن الهياكل والشرائح فقط مسموح بها.
لا أعتقد أنه يعمل مع الخرائط.
ktsakas . لقد جربت اقتراحك ، لكنه لم ينجح. أعتقد أنك على حق ، إنها مجرد بنية أو شرائح.
ربما يمكن أن يكون هذا مفيدًا:
package main
import (
"fmt"
"reflect"
"github.com/jinzhu/gorm"
_ "github.com/mattn/go-sqlite3"
)
type Project struct {
gorm.Model
Name string `gorm:"type:varchar(200)"`
}
func main() {
db, _ := gorm.Open("sqlite3", "db.sqlite3?cache=shared&mode=rwc")
db.AutoMigrate(&Project{})
db.Create(&Project{Name: "A"}) // Demo record inserted
// Now I would like to use reflection to be able to make a generic function
t := reflect.TypeOf(Project{})
fmt.Println(t)
single := reflect.New(t).Interface()
db.Debug().Table("projects").First(single)
fmt.Printf("Single result > %+v\n", single) // Works with a single instance
multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
db.Debug().Table("projects").Find(&multiple) // Log show table and records are found
fmt.Printf("1. Multiple result > %+v\n", multiple) // But, multiple is empty
// Instead:
// Create a pointer to a slice value and set it to the slice
// multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
multiplepointer := reflect.New(multiple.Type())
multiplepointer.Elem().Set(multiple)
db.Debug().Table("projects").Find(multiplepointer.Interface())
fmt.Printf("2. Multiple result > %+v\n", multiplepointer) // multiplepointer contains rows
}
التعليق الأكثر فائدة
ربما يمكن أن يكون هذا مفيدًا: