2013-08-07 25 views
7

'da yansıtarak ayarlayın. Git'deyim, bir yansımayla çalışıyorum. Bir dilimin Özet gösterimi. Ben şu var: Ben slice dan i değerini elde etmek istiyorsanızDilim dizinini Go

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

, çok basit: Ancak

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

, ben için bir yol bulmak gibi olamaz i set değer. Bir harita, m olsaydı reflect.Value ayarlayıcı bir çok metod, örneğin, aşağıdaki mümkündür:

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

Ama dilimleri için bir eşdeğer olarak görünmüyor. Benim bir düşüncem belki slice.Index(i) dan döndürülen değer aslında bir şekilde bir işaretçi, bu yüzden v := slice.Index(i); v.Set(newV) çalışmak işe yarayacaktı? Emin değilim. Fikirler?

cevap

13

Figured out out! Bu zaman önce yayınlanmıştır çıkıyor - benim tahminim slice.Index(0) bir işaretçi döndürdü doğrudur. Özellikle:

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

baskılar:

0 
1 
1 

(Burada go oyun alanında runnable code var)

0

Bu yardımcı olabilir: bir kütüphaneden alınan

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 

geri github.com/webconnex/xmlutil bir süre yazdım, özellikle decode.go.

+0

Sağol. Ben bunu anladım (bir soru yazarken silahı zıplattı: D). – joshlf

+0

@ joshlf13 Birkaç "soru" sorusunu sorduğunuzu gördüm. Yukarıda belirtilen 'xmlutil' ve diğer kodlama paketlerinden bazılarına göz atın. Oldukça yardımcı olmalılar. – Luke

+0

Tamam, yapacak. btw, eğer ilgileniyorsanız, kullanmamın sebebi çok fazla yansıtıyor: “yasadışı” olarak adlandırılan ve teknik olarak izin verilmeyen eylemleri gerçekleştiren işlevler sağlayan genel bir Harita işlevi gibi iki işlev göstergesini karşılaştıran bir paket yazıyorum. vb). Şu anda github üzerinde özel bir repo (henüz üretim için hazır değil), ancak katkıda bulunmaktan çekiniyorsanız, bu konuda yardımcı olmaktan memnuniyet duyarım. – joshlf