StructScan未知结构切片[GO]

时间:2015-12-16 14:20:53

标签: function struct go

所以我想通过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)
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

请参阅http://jmoiron.github.io/sqlx/#altScanning

答案 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)