是否可以在不提及特定类型(本例中为SomeStruct)的情况下为以下代码生成等效代码?
// takes SomeStruct{} and returns &SomeStruct{}
func MakePointerFromStruct(someStruct interface{}) interface{} {
obj := someStruct.(SomeStruct)
return interface{}(&obj)
}
我创建了playground
我的实际问题是,我需要从会话中转换为& User {}一些数据(我从redis获取的数据,其形式为User {})但是对该反序列化值进行操作的代码并不是&#39 ; t知道它的类型,并尝试将其转换为接口..
问题是User {}上有一个指针方法可以修改数据。并且要转换为接口{}变量中的接口值必须已经是指针:& User {}
有些代码要说清楚:
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)
答案 0 :(得分:1)
这样的事情应该有效:
import "reflect"
func MakePointerFromStruct(someStruct interface{}) interface{} {
ptrValue := reflect.New(reflect.TypeOf(someStruct))
reflect.Indirect(ptrValue).Set(reflect.ValueOf(someStruct))
return ptrValue.Interface()
}
答案 1 :(得分:1)
仅仅获取用户{}变量的地址有什么问题?
data := &User{}
someFuncWhereCastingOccurs(data)
看一下这个例子:http://play.golang.org/p/xYqfr5G4mw
PS。顺便说一句,它不是铸造,而是type assertion。
答案 2 :(得分:0)
可以通过
将指针转换为类型不安全的通用指针return unsafe.Pointer(&p)
然后可以将该值转换为您选择的任何指针类型。