go - 返回的 interface{} 类型断言
问题描述
我需要对数据库进行查询的功能。
我使用 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
解决方案
我认为这应该有效。您可以将其类型转换为 *User 并根据您的用例返回 User 值或 *User。
user = i.(*User)
return *user
推荐阅读
- python - 从 webhook 事件 invoice.payment_succeeded 解析 Stripe 数据
- linux - 在 Linux Mint 19 Tara 上安装 Docker
- arrays - Flatten nested array in dictionary
- python - Converting list of arrays for plotting using matplotlib in Python
- javascript - 等待AngularJS中的http响应
- php - 随机抽取特定数量的问题
- c# - How to remove value from Dynamics Entity using SDK library in C#
- html - HTML5 - 部分不会自动将其高度设置为内部组件,而是将其高度设置为跨度高度
- oop - 关于 SOLID 原则,在领导/高级职位上,您应该如何判断他人的代码?
- python - csv.reader 在字段名称中返回“OrderedDict”值