从未知类型创建指针

时间:2014-11-23 12:16:22

标签: interface go

是否可以在不提及特定类型(本例中为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)

3 个答案:

答案 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)

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