gpt4 book ai didi

pointers - 扫描不工作

转载 作者:IT王子 更新时间:2023-10-29 02:15:03 25 4
gpt4 key购买 nike

我的扫描没有更新它的目标变量。我有点让它工作:

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 来定义我的目的地,但我似乎无法通过反射来做到这一点。我意识到这可能很愚蠢,但也许只是为我指出进一步调试的方向会很棒。我的 Go 技术很差!

最佳答案

你到底想要什么?您要更新传递给 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())
}

它将从 main() 打印 1,因为值 1 是在 Execute() 中设置的.

如果您不想更新传递给 Execute() 的变量,只需创建一个具有相同类型的新值,因为您正在使用 reflect.New() 返回一个指针的 Value,你必须传递 existingObj.Interface() 返回一个保存指针的 interface{},你想传递给 Scan() 的东西。 (您所做的是将指向 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() 的另一个变体是,如果您在 reflect.New() 返回的值上调用 Interface():

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 上的所有示例.

关于pointers - 扫描不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35216571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com