Pointers 如何通过golang中的接口{}获得指向结构的指针?
不,我不认为这是一个复制品 . 我知道如何获取接口变量的类型,但是我找不到一种方法来获取指向接口{}的实类型的指针 最近,我在Pointers 如何通过golang中的接口{}获得指向结构的指针?,pointers,go,interface,Pointers,Go,Interface,不,我不认为这是一个复制品 . 我知道如何获取接口变量的类型,但是我找不到一种方法来获取指向接口{}的实类型的指针 最近,我在接口{}方面遇到了麻烦。我通过接口{}传递了一个类型为a的变量,一个方法Tt被定义为*a作为接收器 我想调用方法Tt,但是失败了,因为变量位于接口{}中,并且我无法获取指向该变量的指针 如您所见,reflect.TypeOf(v)给出了正确的类型A,但是reflect.TypeOf(&v)给出了*接口{},而不是*A 有没有办法得到*A package main imp
接口{}
方面遇到了麻烦。我通过接口{}
传递了一个类型为a的变量,一个方法Tt
被定义为*a作为接收器
我想调用方法Tt
,但是失败了,因为变量位于接口{}
中,并且我无法获取指向该变量的指针
如您所见,reflect.TypeOf(v)
给出了正确的类型A
,但是reflect.TypeOf(&v)
给出了*接口{}
,而不是*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()
,必须具有*A
(或获取A
值的地址)。变量b
中的A
值无效,因此A
指针方法无法通过b
访问
修复方法是从a
的地址开始:
var a A
var b interface{}
b = &a // Note change on this line
switch v := b.(type) {
default:
reflect.ValueOf(v).MethodByName("Tt").Call(nil)
}
在调用reflect.ValueOf(v)
中,v
中的值作为参数传递。ValueOf
函数解压空接口以恢复类型为a
的值
在调用reflect.ValueOf(&v)
中,一个*接口{}
存储在空接口中,然后作为参数传递。ValueOf
函数解压空接口以恢复*接口{}
类型的值。这是变量v
的地址,而不是变量a
的地址
在此特定示例中不需要反射:
var a A
var b interface{}
b = &a
switch v := b.(type) {
case interface {
Tt()
}:
v.Tt()
default:
fmt.Println("not handled")
}
你只需要输入cast。
例如:
使用反射:
//
// Return a pointer to the supplied struct via interface{}
//
func to_struct_ptr(obj interface{}) interface{} {
vp := reflect.New(reflect.TypeOf(obj))
vp.Elem().Set(reflect.ValueOf(obj))
return vp.Interface()
}
使用
T
传入一个接口
,然后您可以使用反射包获得一个接口
,使用*T
,您为什么不将方法Tt
放在接口中并完成?在不使用任何反射的情况下?请提供一个可以证明这一点的示例。即使在这里,你的意愿似乎也是错误的me@Yerken,我必须编辑以给出更详细的示例。我希望函数DoSomething
同时接受SomeStruct
和*SomeStruct
是的,这是可行的。但是我确实觉得很奇怪,reflect.ValueOf(v)
给出了A
,而reflect.ValueOf(&v)
给出了*接口{}
我对答案做了更多的解释。
//
// Return a pointer to the supplied struct via interface{}
//
func to_struct_ptr(obj interface{}) interface{} {
vp := reflect.New(reflect.TypeOf(obj))
vp.Elem().Set(reflect.ValueOf(obj))
return vp.Interface()
}