【问题标题】:Golang interface & real typeGolang 界面 & 真实类型
【发布时间】:2018-04-04 15:40:20
【问题描述】:

valuePtrvalue 成为两个interface{}。知道valuePtrvalue类型的指针,如何让valuePtr指向value

我目前使用的“技巧”适用于 reflect 包和类型开关:

switch value.(type) {
case string:
    ptr := reflect.ValueOf(valuePtr).Elem().Addr().Interface().(*string)
    *ptr = value.(string)
case ...:
    [...]
}

这需要为函数赋予的每种类型一个案例。但是,我使用interface{} 使事情变得通用。因此,这种技术最终会导致列出几十种类型的情况。

我想做的是这样的:

ptr := valuePtr.(*type(value))

你遇到过这个问题吗?你做了什么?

【问题讨论】:

  • 出于好奇,您想用这个解决什么问题?
  • 您的反射行获取一个接口,取消引用它,获取它的地址,然后返回您开始使用的相同接口。我不明白那应该是什么目标
  • 看起来您正试图将多态性硬塞到不支持它的语言上,这有点代码味道。也许您的类型系统不是以非常类似于 go 的方式设计的?
  • 这通常是对数据库进行 Get 操作的包装器。 value 是我从数据库中得到的,valuePtr 是用户给出的。我假设用户知道他想要的值的类型。
  • @TimothyJones 你应该是对的,

标签: pointers go interface


【解决方案1】:

根据问题中的代码,您的目标似乎是将指针元素设置为一个值。使用此代码:

reflect.ValueOf(valuePtr).Elem().Set(reflect.ValueOf(value))

playground example

顺便说一句,代码ptr := reflect.ValueOf(valuePtr).Elem().Addr().Interface().(*string) 可以更直接地写成ptr := valuePtr.(*string)

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 2012-04-29
    • 2011-04-29
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多