Interface 从未知类型生成指针

Interface 从未知类型生成指针,interface,go,Interface,Go,是否可以在不提及特定类型(本例中为SomeStruct)的情况下生成与以下内容等效的代码 我创造了一个 我的实际问题是,我需要将会话中的一些数据转换为&User{}(我从redis获得,格式为User{}),但对该反序列化值进行操作的代码对其类型一无所知,并尝试将其转换为接口 问题是在用户{}上有一个指针方法修改数据。而要转换到接口{}中的接口值,变量必须已经是指针:&User{} 下面是一些代码,以明确说明: type User struct {} func (u *User) FillFr

是否可以在不提及特定类型(本例中为SomeStruct)的情况下生成与以下内容等效的代码

我创造了一个


我的实际问题是,我需要将会话中的一些数据转换为&User{}(我从redis获得,格式为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)

指针可以通过以下方式转换为不安全的泛型指针类型:

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

仅仅获取用户{}变量的地址有什么问题

data := &User{}
someFuncWhereCastingOccurs(data)
看看这个例子:


顺便说一句,它不是强制转换,而是。

我需要指向原始值的指针,以便结构的指针方法可以更改它。在您的示例中,我看到分配了新结构,并将旧结构的值复制到其中。@user3668351:但Go是按值传递的。传递结构的事实意味着您不能影响原始结构。这与您对“与以下内容等效的代码”的代码示例所做的操作相同。您还可以通过声明struct类型的变量(
obj
)来“分配新结构”;然后您将结构值复制到它(它已经是传递值的副本,因为Go是传递值;您将再次复制它)?userObjPtr:=不安全的.Pointer(&userObj)structType:=reflect.TypeOf(userObj)return reflect.NewAt(structType,userObjPtr.Interface()。(UserInterface)@user3668351如果函数应该返回已经强制转换为新类型的指针,则类似于
return(*UserInterface)(不安全的.Pointer(&userObj))
Hmm。。当我使用
*(*UserInterface)(unsafe.Pointer(&userObj))
时,我得到了无效的内存地址。。请看这里:啊,我误解了你的意图。我不明白你为什么不能用WhentPeisknown密码?
data := &User{}
someFuncWhereCastingOccurs(data)