2014-11-05 24 views
0

如何走到這一步的工作原理:爲什麼我無法使用反射來獲取切片的地址?

slice := make([]string, 0, 10) 
sliceptr := &slice 

這太:

sliceptr := &[]string{"foo","bar","baz"} 

但這並不:

sliceaddrval := reflect.ValueOf([]string{"foo","bar","baz"}).Addr() 

它與恐慌:reflect.Value.Addr of unaddressable value


編輯:總的來說,我想要做的是採取一個未知類型的結構,做出該類型的結構片,並返回一個指針(我使用github.com/jmoiron/modl,它需要一個指向切片的指針,用來填充來自SQL查詢的結果)。

回答

5

reflect.Value需要一個interface{}和一個interface{}到一個值不能用來改變原來的。否則,當你甚至不打算將它傳遞給指針時,最終可能會在代碼更改struct中的數據。 (或者,在這種情況下,改變按值傳遞的片段的長度。)因此,如果您拿到地址,則必須在ValueOf之前執行此操作。

要指向一個切片,你可以傳遞給一個包,append它(如modl或谷歌的App Engine GetMulti),你會使用類似http://play.golang.org/p/1ZXsqjrqa3,複製在這裏:

package main 

import (
    "fmt" 
    "reflect" 
) 

type row struct { i, j int } 

func main() { 
    aRow := row{} 

    valueType := reflect.ValueOf(aRow).Type() 
    slicePtrVal := reflect.New(reflect.SliceOf(valueType)) 
    slicePtrIface := slicePtrVal.Interface() 

    getQueryResults(slicePtrIface) 
    fmt.Println(slicePtrIface) 
} 

// standing in for `modl` or whatever populates the slice 
func getQueryResults(slicePtr interface{}) { 
    sPtr := slicePtr.(*[]row) 
    (*sPtr) = append((*sPtr), row{1,3}) 
} 

reflect.Value中追加切片時,您自己需要再拍幾行reflect,但聽起來您正在使用的包將爲您處理該部分。對於一般信息,代碼做追加在http://play.golang.org/p/m3-xFYc6ON及以下:

package main 

import (
    "fmt" 
    "reflect" 
) 

type row struct { i, j int } 

func main() { 
    aRow := row{} 

    // make a pointer to an empty slice 
    rowType := reflect.ValueOf(aRow).Type() 
    slicePtrVal := reflect.New(reflect.SliceOf(rowType)) 
    slicePtrIface := slicePtrVal.Interface() 

    // append a zero row to it 
    rowVal := reflect.Zero(rowType) 
    sliceVal := reflect.Indirect(slicePtrVal) 
    sliceVal.Set(reflect.Append(sliceVal, rowVal)) 

    fmt.Println(slicePtrIface) 
} 
+1

實際上,認爲正確的答案是精神相似,但略有不同的(它是一個'接口{}'拿着值類型不能像指針一樣使用),編輯 – twotwotwo 2014-11-05 19:16:43

+0

好的。你對片段標題的看法是有道理的,我想我只是不明白當你這樣做時指針指向的是什麼:&[] string {}或者說爲什麼似乎沒有與之相當的反射。 – 2014-11-05 19:23:08

+0

我加了一點問題。基本上我正在尋找的是「爲X類型(一個」別人「提供的結構)創建一個空片段並獲取它的指針」,我需要它來收集查詢的結果。 – 2014-11-05 19:28:51

相關問題