16

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

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

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

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

但是,我似乎找不到设置第 i 个值的方法。reflect.Value有很多 setter 方法,例如,如果我有一个 map, m,以下是可能的:

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

但似乎没有切片的等价物。我的一个想法是,也许返回的值slice.Index(i)实际上是一个指针,所以调用v := slice.Index(i); v.Set(newV)会起作用吗?我不确定。想法?

4

2 回答 2

22

弄清楚了!原来我过早地发布了这个 - 我的猜测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

(这是go 操场上的可运行代码)

于 2013-08-08T00:05:53.583 回答
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。

于 2013-08-08T00:02:36.703 回答