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

扫描不工作

扫描不工作

Go
素胚勾勒不出你 2021-12-07 18:44:11
我的扫描未更新其目标变量。我有点让它与: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用来定义我的目的地,但我似乎无法通过反射来做到这一点。我意识到这可能很愚蠢,但即使只是指出我进一步调试的方向也会很棒。我的围棋技巧非常缺乏!
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

你到底想要什么?您想更新传递给的变量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上的所有示例。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

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