使用Go中的reflect设置切片索引

时间:2013-08-07 23:59:05

标签: reflection go slice

我在Go中,处理切片的reflect.Value表示。我有以下内容:

slice := reflect.MakeSlice(typ, len, cap)

如果我想从slice获得第i个值,那很简单:

v := slice.Index(i) // returns a reflect.Value

但是,我似乎无法找到设置第i个值的方法。 reflect.Value有很多setter方法,例如,如果我有一张地图m,则可能有以下内容:

m.SetMapIndex(key, value) // key and value have type reflect.Value

但似乎没有相应的切片。我的一个想法是,slice.Index(i)返回的值实际上可能是一个指针,所以调用v := slice.Index(i); v.Set(newV)会有效吗?我不确定。想法?

2 个答案:

答案 0 :(得分:15)

想出来!事实证明我过早地发布了这个 - 我的猜测slice.Index(0)返回一个指针是正确的。特别是:

one := reflect.ValueOf(int(1))

slice := reflect.MakeSlice(reflect.TypeOf([]int{}), 1, 1)
v := slice.Index(0)
fmt.Println(v.Interface())

v.Set(one)
fmt.Println(v.Interface())

v = slice.Index(0)
fmt.Println(v.Interface())

打印:

0
1
1

(这里' s runnable code在游乐场)

答案 1 :(得分:0)

这可能会有所帮助:

n := val.Len()
if n >= val.Cap() {
    ncap := 2 * n
    if ncap < 4 {
        ncap = 4
    }
    nval := reflect.MakeSlice(val.Type(), n, ncap)
    reflect.Copy(nval, val)
    val.Set(nval)
}
val.SetLen(n + 1)
// ...
val.Index(n).SetString("value") // Depends on type

我从一个图书馆拍摄了一段时间github.com/webconnex/xmlutil,特别是decode.go。