从未知类型制作指针
是否可以在不提及特定类型(本例中为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)
该值可以转换为您选择的任何指针类型。
像这样的东西应该工作:
import "reflect"
func MakePointerFromStruct(someStruct interface{}) interface{} {
ptrValue := reflect.New(reflect.TypeOf(someStruct))
reflect.Indirect(ptrValue).Set(reflect.ValueOf(someStruct))
return ptrValue.Interface()
}
我需要指向原始值的指针,所以struct的指针方法可以改变它。在你的例子中,我看到新的结构被分配,并且旧的结构被复制到它.. – user3668351 2014-11-23 20:44:39
@ 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。
无法简化该代码? userObjPtr:= unsafe.Pointer(&userObj) structType:= reflect.TypeOf(userObj) 返回reflect.NewAt(structType,userObjPtr)。接口()(的UserInterface) – user3668351 2014-11-23 20:52:42
@ user3668351如果函数应该已经返回指针。 (* UserInterface)(unsafe.Pointer(&userObj))' – 2014-11-23 21:34:23
嗯..当我使用'*(* 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