我希望使用一些需要指向结构体的指针的外部代码。在调用代码的时候,我有一个接口变量。
当从该变量创建指针时,指针的类型是
假设代码中的
我该如何将其强制转换为这个类型?
以下是代码示例:
测试失败,出现以下错误:
当从该变量创建指针时,指针的类型是
interface{}*
,而我需要它是结构体类型的指针类型。假设代码中的
TestCanGetStructPointer
不知道 Cat 类 的存在,并且它存在于某个外部程序包中。我该如何将其强制转换为这个类型?
以下是代码示例:
import (
"reflect"
"testing"
)
type Cat struct {
name string
}
type SomethingGeneric struct {
getSomething func() interface{}
}
func getSomeCat() interface{} {
return Cat{}
}
var somethingForCats = SomethingGeneric{getSomething: getSomeCat}
func TestCanGetStructPointer(t *testing.T) {
interfaceVariable := somethingForCats.getSomething()
pointer := &interfaceVariable
interfaceVarType := reflect.TypeOf(interfaceVariable)
structPointerType := reflect.PtrTo(interfaceVarType)
pointerType := reflect.TypeOf(pointer)
if pointerType != structPointerType {
t.Errorf("Pointer type was %v but expected %v", pointerType, structPointerType)
}
}
测试失败,出现以下错误:
指针类型为*interface {},但预期为*parameterized.Cat
。
x := somethingForCats.getSomething().(Cat); &x
,除非您将return Cat{}
更改为return &Cat{}
或return new(Cat)
,否则只需使用somethingForCats.getSomething().(*Cat)
。请阅读类型断言规范。 - Dave Cinterface{}
并需要一个*structType
传递到其他地方。类型断言是实现这一点的最简单方法。 - Dave C