【发布时间】:2019-09-02 21:06:15
【问题描述】:
我需要查询数据库的函数。
我使用 github.com/gocraft/dbr,所以我创建了辅助函数:
//SelectData - selects data from database
func SelectData(table, fields, where string, data interface{}) interface{} {
var ptr reflect.Value
ptr = reflect.New(reflect.TypeOf(data)) // create new pointer
obj := ptr.Interface()
sess := Session
query := sess.Select(fields).
From(table)
if len(where) > 0 {
query.Where(where)
}
_, err := query.Load(obj)
if err != nil {
panic(err)
}
return obj
}
然后我尝试使用它:
//CheckUser - checks is user registered in db
func CheckUser(userid string) User {
var user User
var i interface{}
i = db.SelectData("users", "*", "", user)
fmt.Printf("=%#v \n", i)
user = i.(User)
return user
}
但我得到运行时错误:
interface conversion: interface {} is *models.User, not models.User
D:/Go/src/runtime/panic.go:513 (0x42ccb6)
gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
D:/Go/src/runtime/iface.go:248 (0x4091ac)
panicdottypeE: panic(&TypeAssertionError{iface, have, want, ""})
C:/Users/vasalt/go/src/wcenter/models/model_user.go:29 (0x9dda3a)
CheckUser: user = i.(User)
C:/Users/vasalt/go/src/wcenter/controllers/ctrl_main.go:59 (0x9e03b6)
SetPageData: fmt.Printf("=result = %#v\n", models.CheckUser("1234"))
并调试输出:
=&models.User{UID:sql.NullString{String:"1", Valid:true}, UserID:sql.NullString{String:"1234", Valid:true}, UserGroup:sql.NullString{String:"1", Valid:true}}
所以它成功地从数据库中检索数据,但它返回&models.User 而不仅仅是models.User,我无法弄清楚如何将interface{} 与*models.User 转换为models.User
【问题讨论】:
-
nope models\model_user.go:29:7: cannot use i.(*User) (type *User) as type User in assignment
-
var user 用户应该是
var user *User
标签: go reflection interface