我正在尝试编写一个函数,该函数通过使用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(如果可以的话)。
谢谢!
答案 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{}
中。