从接口获取基本的反射。价值{}

时间:2019-06-06 09:08:38

标签: go reflection

我正在尝试编写一个函数,该函数通过使用reflect.Type提供基础类型来返回空接口{}中的基础reflect.Value:

// code in: https://play.golang.org/p/p6NLm18LjzM
package main

import (
    "fmt"
    "reflect"
)

type MyInt struct{
    x int
}

func getUnderlyingAsValue( data interface{}, underlyingType reflect.Type) reflect.Value{

    underlyingData := data.(underlyingType) // <-- Doesn't compile "underlyingType is not a type"
    return reflect.ValueOf(underlyingData)

}

func main() {

    var i int
    i = 5
    myInt := &MyInt{x:i}

    underVal := getUnderlyingAsValue(myInt, reflect.TypeOf(i))

    if underVal.Type() != reflect.TypeOf(myInt){
        fmt.Printf("Doesn't Work! :-(")
    } else {
        fmt.Printf("SUCCESS!")
    }
}

如代码中所写,类型断言不起作用,因为“ reflect.Type”不是类型。

有人知道如何解决吗?最好不要在接口的底层结构中使用uintptr(如果可以的话)。

谢谢!

1 个答案:

答案 0 :(得分:0)

Go是一种静态类型的语言,您不能将assert键入“动态类型”。

但是您不必这样做。将interface{}值中可用的任何具体值“包装”起来不需要任何魔术,只需将其原样传递给reflect.ValueOf()

func getUnderlyingAsValue(data interface{}, underlyingType reflect.Type) reflect.Value {
    return reflect.ValueOf(data)
}

或者简单地:

func getUnderlyingAsValue(data interface{}) reflect.Value {
    return reflect.ValueOf(data)
}

(此功能甚至不存在被证明存在的原因,它是如此简单。)

Go Playground上尝试。

当您执行的下一个也是唯一的操作是将其传递给需要interface{}的函数时,就没有从interface{}来确定具体类型的点类型。它将再次包装在interface{}中。