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()
}