16

私はGoで、スライスのreflect.Value表現を扱っています。私は次のものを持っています:

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

から i 番目の値を取得したい場合はslice、簡単です。

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

ただし、 i 番目の値を設定する方法が見つからないようです。reflect.Valueたとえば、マップがあった場合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

(外出先で実行可能なコードはこちら)

于 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 に答える