गो

2013-08-07 4 views
7

में प्रतिबिंबित करके स्लाइस इंडेक्स सेट करें मैं एक प्रतिबिंब के साथ काम कर रहा हूं, एक प्रतिबिंब के साथ काम कर रहा हूं। एक टुकड़ा का वैल्यू प्रतिनिधित्व। मैं निम्नलिखित है:गो

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

मैं slice से ith मूल्य प्राप्त करना चाहते हैं, यह आसान है: मैं के लिए एक रास्ता खोजने के लिए नहीं कर पा रहे,

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

हालांकि सेट ith मूल्य। reflect.Value सेटर तरीकों के बहुत सारे है, उदाहरण के लिए, अगर मैं एक नक्शा, m था, निम्नलिखित संभव है:

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

लेकिन वहाँ स्लाइस के लिए एक समान होना प्रतीत नहीं होता है। मेरा एक विचार था कि शायद 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

अरे, धन्यवाद। मैंने इसे समझ लिया (एक सवाल पोस्ट करने पर बंदूक कूद गया: डी)। – joshlf

+0

@ joshlf13 मुझे लगता है कि आपने कुछ 'प्रतिबिंबित' प्रश्न पूछे हैं। उपरोक्त लिंक 'xmlutil', साथ ही साथ कुछ अन्य एन्कोडिंग पैकेज देखें। उन्हें थोड़ा सा मदद करनी चाहिए। – Luke

+0

ठीक है, करेंगे। बीटीडब्ल्यू, यदि आप रुचि रखते हैं, तो मैं जिस कारण का उपयोग कर रहा हूं वह बहुत प्रतिबिंबित करता है कि मैं "अवैध" नामक एक पैकेज लिख रहा हूं जो तकनीकी रूप से अस्वीकृत कार्यों को करने के लिए कार्य प्रदान करता है (जैसे एक सामान्य मानचित्र फ़ंक्शन, दो फ़ंक्शन पॉइंटर्स की तुलना करना, आदि)। फिलहाल यह गिटूब पर एक निजी रेपो है (अभी तक उत्पादन के लिए तैयार नहीं है), लेकिन अगर आपको योगदान देने में कोई रूचि है, तो मुझे इसमें मदद करने में खुशी होगी। – joshlf