为了账号安全,请及时绑定邮箱和手机立即绑定

StructScan 未知结构切片 [GO]

StructScan 未知结构切片 [GO]

Go
守着星空守着你 2021-11-29 16:29:56
所以我想通过该StructScan方法填充任何结构,然后将我从数据库中获得的任何数据读取到我提供测试函数的相关结构中。这个脚本没有给出任何编译错误(如果你实现了其他东西,比如数据库连接等等),但该StructScan方法仍然返回一个错误并告诉我它需要一个结构片。如何创建一段我不知道类型的结构?感谢您的任何建议。package mainimport (    "database/sql"    "github.com/jmoiron/sqlx")var db *sql.DBtype A struct {    Name string `db:"name"`}type B struct {    Name string `db:"name"}func main() {    testA := []A{}    testB := []B{}    test(testA, "StructA")    test(testB, "StructB")}func test(dataStruct interface{}, name string) {    rows, err := db.Query("SELECT * FROM table WHERE name =", name)    if err != nil {        panic(err)    }    for rows.Next() {        err := sqlx.StructScan(rows, &dataStruct)        if err != nil {            panic(err)        }    }
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

聚会超级迟到,但在研究另一个问题时遇到了这个问题。对于偶然发现它的其他人,问题在于您将指针传递给dataStructinto StructScan()。 dataStruct是一个接口,指向接口的指针在 Go 中几乎总是一个错误(事实上,他们在几个版本之前移除了接口指针的自动取消引用)。您也在按值传递目的地。


因此,您将指针传递给保存目标切片副本的接口,而您想要的是直接传递该接口,并且该接口保存指向目标切片的指针。


代替:


test(testA, "StructA")

test(testB, "StructB")

// ...

err := sqlx.StructScan(rows, &dataStruct)

用:


test(&testA, "StructA")

test(&testB, "StructB")

// ...

err := sqlx.StructScan(rows, dataStruct)


查看完整回答
反对 回复 2021-11-29
?
九州编程

TA贡献1785条经验 获得超4个赞

如果您不知道目标结构类型是什么,请使用sqlx.MapScansqlx.SliceScan。它们不映射到结构,但都返回查询结果中的所有列。

http://jmoiron.github.io/sqlx/#altScanning


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信