【发布时间】:2015-03-23 22:47:02
【问题描述】:
我想使用一些需要指向结构的指针的外部代码。在调用代码时,我有一个接口变量。
当从该变量创建指针时,指针的类型是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)
}
}
测试失败:
Pointer type was *interface {} but expected *parameterized.Cat
【问题讨论】:
-
x := somethingForCats.getSomething().(Cat); &x除非您将return Cat{}更改为return &Cat{}或return new(Cat),然后再更改为somethingForCats.getSomething().(*Cat)。 Read the spec on type assertions. -
@DaveC 嗯,可以玩一点,但绝对不是性能好:stackoverflow.com/a/29222497/1162491
-
@DaveC 运行此代码的位置不会知道 Cat 类型,因此它不能直接转换为该类型。此外,此代码需要适用于任何类型的 getSomething() 返回。它适用于单独包中的代码。您可以将指向接口的指针传递到此外部包中。
-
@OvedD 然后编辑您的问题。目前第一段说你有一个
interface{}并且需要一个*structType才能通过其他地方。类型断言是最简单的方法。
标签: go