扫描不工作

我的扫描未更新其目标变量。我有点让它与:


ValueName := reflect.New(reflect.ValueOf(value).Elem().Type())

但我不认为它以我想要的方式工作。


func (self LightweightQuery) Execute(incrementedValue interface{}) {

    existingObj := reflect.New(reflect.ValueOf(incrementedValue).Elem().Type())

    if session, err := connection.GetRandomSession(); err != nil {

        panic(err)

    } else {

        // buildSelect just generates a select query, I have test the query and it comes back with results.

        query := session.Query(self.buildSelect(incrementedValue))

        bindQuery := cqlr.BindQuery(query)

        logger.Error("Existing obj ", existingObj)

        for bindQuery.Scan(&existingObj) {

            logger.Error("Existing obj ", existingObj)

            ....

        }

   }

}

两条日志消息完全相同Existing obj &{ 0  0  0 0 0 0 0 0 0 0 0 0}(空格是字符串字段。)这是因为大量使用反射来生成新对象吗?在他们的文档中,它说我应该var ValueName type用来定义我的目的地,但我似乎无法通过反射来做到这一点。我意识到这可能很愚蠢,但即使只是指出我进一步调试的方向也会很棒。我的围棋技巧非常缺乏!


素胚勾勒不出你
浏览 122回答 1
1回答

侃侃无极

你到底想要什么?您想更新传递给的变量Execute()吗?如果是这样,您必须将指针传递给Execute(). 然后你只需要传递reflect.ValueOf(incrementedValue).Interface()给Scan(). 这是有效的,因为reflect.ValueOf(incrementedValue)是一个reflect.Value持有一个interface{}(您的参数的类型),它持有一个指针(您传递给的指针Execute()),Value.Interface()并将返回一个interface{}持有指针的类型的值,您必须传递的确切内容Scan()。请参阅此示例(使用fmt.Sscanf(),但概念相同):func main() {    i := 0    Execute(&i)    fmt.Println(i)}func Execute(i interface{}) {    fmt.Sscanf("1", "%d", reflect.ValueOf(i).Interface())}它将1从打印main(),因为该值1设置在 内Execute()。如果您不想更新传递给 的变量Execute(),只需创建一个具有相同类型的新值,因为您使用的reflect.New()是返回Value指针的 ,您必须传递existingObj.Interface()返回一个interface{}持有指针的指针,您想要的东西传递给Scan(). (你所做的是你传递了一个指向 a 的指针reflect.Value,Scan()这不是所Scan()期望的。)演示fmt.Sscanf():func main() {    i := 0    Execute2(&i)}func Execute2(i interface{}) {    o := reflect.New(reflect.ValueOf(i).Elem().Type())    fmt.Sscanf("2", "%d", o.Interface())    fmt.Println(o.Elem().Interface())}这将打印2.的另一个变体Execute2()是,如果您直接调用Interface()由 返回的值reflect.New():func Execute3(i interface{}) {    o := reflect.New(reflect.ValueOf(i).Elem().Type()).Interface()    fmt.Sscanf("3", "%d", o)    fmt.Println(*(o.(*int))) // type assertion to extract pointer for printing purposes}这Execute3()将按3预期打印。尝试Go Playground上的所有示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go