所以我想通过StructScan
方法填充任何结构,所以读取我从db得到的关于结构的任何数据我都给测试函数提供了。
这个脚本没有给出任何编译错误(如果你实现其他的东西,如数据库连接等)但仍然StructScan
方法返回错误并告诉我它需要一片结构。
如何创建一块我不知道其类型的结构?
感谢您的任何建议。
package main
import (
"database/sql"
"github.com/jmoiron/sqlx"
)
var db *sql.DB
type 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)
}
}
}
答案 0 :(得分:0)
如果您不知道目标结构类型是什么,请使用sqlx.MapScan
或sqlx.SliceScan
。它们不映射到结构,但都返回查询结果中的所有列。
答案 1 :(得分:0)
超级晚会,但在研究另一个问题时遇到了这个问题。对于偶然发现它的其他人来说,问题在于您将dataStruct
的指针传递给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)