2014-11-23 32 views
0

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

回答

0

的指針可以被轉換爲類型 - 不安全的通用指針

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

1

像這樣的東西應該工作:

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