不,我不认为这是如何确定interface{}值的“真实”类型?的重复。我知道如何获取接口变量的Type,但我找不到一种方法来获取interface{}的实际类型的指针。
最近,我遇到了interface{}的问题。我有一个类型为A的变量通过interface{}传递,一个以*A为接收器的方法Tt被定义。
我想调用方法Tt,但失败了,因为变量在interface{}中,我无法获取指向该变量的指针。
正如您所看到的,reflect.TypeOf(v)给出了正确的类型A,但reflect.TypeOf(&v)却给出了*interface {}而不是*A。
是否有任何方法可以获得*A?
package main
import (
"fmt"
"reflect"
)
type SomeStruct1 struct{
}
type SomeStruct2 struct{
}
type SomeStruct3 struct{
}
etc...
func (*SomeStruct1) SomeMethod(){
fmt.Println("hello")
}
func (*SomeStruct2) SomeMethod(){
fmt.Println("hello")
}
func (*SomeStruct3) SomeMethod(){
fmt.Println("hello")
}
etc...
func DoSomething(arg interface{}){
switch v:=b.(type){
[]byte:{
dosomething for []byte
}
default:{
var m reflect.Value
if value.Kind() != reflect.Ptr {
m = reflect.ValueOf(&v).MethodByName("SomeMethod")
} else {
m = reflect.ValueOf(v).MethodByName("SomeMethod")
}
m.Call(nil)
}
}
func main() {
DoSomething([]byte{...})
DoSomething(SomeStruct1{})
DoSomething(&SomeStruct1{})
etc..
}
Tt
放在接口中并完成呢?而不使用任何反射? - gonutzDoSomething
可以接受SomeStruct
和*SomeStruct
。 - user1895011