2014-11-03 132 views
2

我收到一個基本上是切片的接口。現在我想將它轉換爲指向切片的指針。問題是,我有切片本身或指向接口的指針。 我可以輕鬆地顯示在一個代碼示例:將接口{}轉換爲golang中的* [] int

func main(){ 
    model := []int{1,2,3,4,5,6,7,8,10,11,133123123123} 
    method(model) 
} 

func method(model interface{}){ 
    fmt.Println(reflect.TypeOf(model)) // this is of type []int 
    fmt.Println(reflect.TypeOf(&model)) // this is of type *interface{} 
} 

我需要的是這種類型:

fmt.Println(reflect.TypeOf(result)) // this should be type *[]int 

我只知道在運行時的類型,所以我不能只是採取 &(model.([]int))

有沒有使用golang反射來接收這個的方法? 'int'類型實際上並不重要,重要的是,它是一個指向片段的指針。 *[]interface{}也可以。

編輯︰
爲了使問題更清楚,我應該補充說:我對切片的數據不感興趣,但只有在獲取指向同一類型切片(它可以基本上是空的) 。所以James Henstridge完美地回答了作品。

+0

http://golang.org/pkg/reflect/#Value.Addr有什麼問題?我承認我不明白你真正想做什麼。這真的取決於。並非Go **中的所有值都是**可尋址的,因此可能無法做到。你想用* [] int做什麼? – Volker 2014-11-03 21:21:34

+0

事實上,這個值是不可尋址的。 基本上我想創建一個預定義類型的片(使用reflect.MakeSlice)並將它傳遞給mgo的一個方法(mgo的Query的All()方法)。這個方法需要一個Ptr到Slice。我通過在已知類型的外部創建切片來找到解決方案。但我試圖找到一種通用的方式來做到這一點。 我理解你是否正確,因爲它不是一個可解決的價值,這是不可能的? – Chrisport 2014-11-03 21:36:56

+0

*所有內容都以價值傳遞。將值複製到'method'調用後,您無法獲得指向'model'的指針。無論它是否是'interface {}'都沒關係,你有切片值,而不是指針。 – JimB 2014-11-03 22:54:45

回答

3

在試圖回答這個問題之前,有必要回過頭來問一下你以後的*[]int值應該指向什麼?

鑑於方式method叫我們不可能得到一個指針從調用上下文的model變量,因爲它只會收到片作爲其參數的副本(注意,這是片的副本標題:支持陣列是共享的)。

我們也無法獲取指向作爲參數傳遞的副本的指針,因爲它存儲爲interface{}變量:接口變量擁有用於存儲其動態值的內存,並且可以隨時重用新的價值被分配給它。如果可以將指針指向動態值,那麼如果分配了不同的類型,這將會破壞類型安全性。

我們可以得到一個*[]int指針,如果我們做切片的第三個副本,但尚不清楚是否這就是你一定要或者:

v := reflect.New(reflect.TypeOf(model)) 
v.Elem().Set(reflect.ValueOf(model)) 
result := v.Interface() 

這基本上是一個類型不可知的方式寫如下:

v := new([]int) 
*v = model 
var result interface{} = v 

現在,如果你真的想要一個指向調用上下文切片變量,您將需要確保method是帶一個指針,而不是切片並採取相應行動。

+0

這是一個很好的使用反射包。 – Drew 2014-11-04 05:53:52

+0

謝謝,這個作品完美!我基本上對切片數組的內容不感興趣(在我的用例中它總是空的),但只是在獲得相同類型的切片和指向它的指針。 – Chrisport 2014-11-04 07:46:36