从未知类型制作指针

问题描述:

是否可以在不提及特定类型(本例中为SomeStruct)的情况下为以下内容制作等效代码?从未知类型制作指针

// takes SomeStruct{} and returns &SomeStruct{} 
func MakePointerFromStruct(someStruct interface{}) interface{} { 
    obj := someStruct.(SomeStruct) 
    return interface{}(&obj) 
} 

我创建了一个playground


我实际的问题是,我需要转换为&用户{}从会话中的一些数据(这是我从Redis的获取和其处于形式用户{})但代码运行在该反序列化的值不知道任何关于它的类型,并试图将其转换为接口..

问题是,用户{}上有一个指针方法修改数据。和投射到一个接口值中的接口{}变量必须已经是指针:&用户{}

一些代码,使其明确:

type User struct {} 
func (u *User) FillFromOauth(name string) { 
    u.Name = name 
    //... 
} 

type UserInterface interface { 
    FillFromOauth(name string) 
} 

func someFuncWhereCastingOccurs(userObj interface{}) { 
    user := userObj.(UserInterface) // 
} 

data := User{} 
someFuncWhereCastingOccurs(data) 

的指针可以被转换为类型 - 不安全的通用指针

return unsafe.Pointer(&p) 

该值可以转换为您选择的任何指针类型。

+0

无法简化该代码? userObjPtr:= unsafe.Pointer(&userObj) structType:= reflect.TypeOf(userObj) 返回reflect.NewAt(structType,userObjPtr)。接口()(的UserInterface) – user3668351 2014-11-23 20:52:42

+0

@ user3668351如果函数应该已经返回指针。 (* UserInterface)(unsafe.Pointer(&userObj))' – 2014-11-23 21:34:23

+0

嗯..当我使用'*(* UserInterface)(unsafe.Pointer(&userObj)时,我得到无效的内存地址))'..看这里请:[http://play.golang.org/p/7KhMHpf-hH](http://play.golang.org/p/7KhMHpf-hH) – user3668351 2014-11-24 06:57:48

像这样的东西应该工作:

import "reflect" 

func MakePointerFromStruct(someStruct interface{}) interface{} { 
    ptrValue := reflect.New(reflect.TypeOf(someStruct)) 
    reflect.Indirect(ptrValue).Set(reflect.ValueOf(someStruct)) 
    return ptrValue.Interface() 
} 
+0

我需要指向原始值的指针,所以struct的指针方法可以改变它。在你的例子中,我看到新的结构被分配,并且旧的结构被复制到它.. – user3668351 2014-11-23 20:44:39

+0

@ user3668351:但是Go是通过值。你传递结构的事实意味着你不能影响原来的。这与您为“与以下代码相同的代码”展示的代码示例所做的相同。你也是通过声明一个struct类型的变量('obj')来“分配一个新的结构”;然后你将结构值复制到它(它已经是传递值的一个副本,因为Go是按值传递的;你正在复制它)。 – newacct 2014-11-24 01:33:14

什么是对刚才把你的用户{}变量的地址的问题?

data := &User{} 
someFuncWhereCastingOccurs(data) 

看看这个例子:http://play.golang.org/p/xYqfr5G4mw

PS。顺便说一下,它不是铸造,它是type assertion