2013-08-07 16 views
7

I'm in Go, che funziona con una reflect.Value rappresentazione di una sezione. Ho il seguente:Imposta indice di sezione utilizzando reflect in Go

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

Se voglio ottenere il valore-esimo dal slice, è semplice:

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

Tuttavia, non riesco a trovare un modo per impostare i-esimo valore. reflect.Value ha un sacco di metodi setter, per esempio, se ho avuto una mappa, m, il seguente è possibile:

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

Ma non sembra essere un equivalente per le fette. Il mio unico pensiero è che forse il valore restituito da slice.Index(i) è in realtà un puntatore in qualche modo, quindi chiamare v := slice.Index(i); v.Set(newV) funzionerebbe? Non ne sono sicuro. Idee?

risposta

13

Capito! Risulta che ho postato questo prematuramente - la mia ipotesi che slice.Index(0) restituisce un puntatore era corretta. In particolare:

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()) 

stampe:

0 
1 
1 

(Ecco runnable code nel parco giochi GO)

0

Questo potrebbe aiutare:

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 

Tratto da una libreria ho scritto un po 'indietro github.com/webconnex/xmlutil, specificamente decode.go.

+0

Ehi, grazie. L'ho capito (una specie di salto di pistola nel pubblicare una domanda: D). – joshlf

+0

@ joshlf13 Noto che hai fatto alcune domande 'reflect'. Controlla il 'xmlutil' linkato sopra, così come alcuni degli altri pacchetti di codifica. Dovrebbero aiutare un po '. – Luke

+0

Ok, lo farò. A proposito, se sei interessato, la ragione per cui sto usando riflette molto è che sto scrivendo un pacchetto chiamato "illegale" che fornisce funzioni per eseguire azioni tecnicamente non consentite (come una generica funzione Mappa, confrontando due puntatori di funzione, eccetera). Al momento è un repo privato su github (non ancora pronto per la produzione), ma se sei interessato a contribuire, sarei felice di avere un aiuto. – joshlf

Problemi correlati