2013-08-07 11 views
7

私はGoで作業しています。スライスのreflect.Value表現で作業しています。私は、次があります。Goで反射を使用してスライスインデックスを設定する

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

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

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

しかし、私はセットへの道を見つけることができないよう i番目の値。

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

しかし、スライスの等価があるように思えません。私はマップ、mを持っていた場合reflect.Valueは、setterメソッドがたくさんあり、例えば、次のことが可能です。私の考えは、おそらくslice.Index(i)から返された値が実際には何とかポインタなので、v := slice.Index(i); v.Set(newV)を呼び出すことは効果がありますか?よく分かりません。アイデア?

答えて

13

私はこれを早めに投稿しました。私の推測では、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 

(ここでは、外出先の遊び場にrunnable codeだ)

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。

+0

ねえ、ありがとう。私はそれを考え出した(質問を掲示して銃を飛ばした:D)。 – joshlf

+0

@ joshlf13あなたはいくつかの「反映する」質問をしたことに気付きました。上にリンクされている 'xmlutil'とその他のエンコーディングパッケージを調べてください。彼らはかなり助けてください。 – Luke

+0

よろしくお願いいたします。あなたが興味を持っているならば、私が使用している理由は、私が "illegal"というパッケージを書いていることです。これは技術的に許可されていないアクションを実行する機能を提供しています(2つの関数ポインタ、等)。現時点ではまだギタップのプライベートレポですが(まだ準備はできていませんが)、寄稿に興味があれば、助けてもらえたらうれしいです。 – joshlf

関連する問題