reflect
पैकेज का उपयोग कर संरचना फ़ील्ड के साथ काम करने में कोई कठिन समय नहीं है। विशेष रूप से, यह पता नहीं लगाया गया है कि फ़ील्ड मान कैसे सेट करें।प्रतिबिंबित करने का उपयोग करके, आप संरचना फ़ील्ड का मान कैसे सेट करते हैं?
type t struct { fi int; fs string } var r t = t{ 123, "jblow" } var i64 int64 = 456
क्षेत्र का नाम हो रही है मैं - यह एक के रूप में मैदान के
var field = reflect.TypeOf(r).Field(i).Name
हो रही मूल्य मैं काम करने के लिए) इंटरफेस {} लगता है, ख) पूर्णांक - यह काम करने के लिए लगता है
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
क्षेत्र के
सेटिंग मूल्य मैं - एक कोशिश - आतंक
reflect.ValueOf(r).Field(i).SetInt(i64)
आतंक: reflect.Value · SetInt मूल्य का उपयोग कर unexported क्षेत्र
का उपयोग कर इसे मानते हुए क्षेत्र पसंद नहीं आया प्राप्त नाम "आईडी" और "नाम", इसलिए इसका नाम बदलकर "आईडी" और "नाम"
ए) क्या यह धारणा सही है?
ख) यदि सही है, एक ही फाइल/पैकेज में के बाद से आवश्यक नहीं सोचा था कि क्षेत्र के
सेटिंग मूल्य मैं - कोशिश दो (फ़ील्ड नाम पूंजीकृत के साथ) - आतंक
reflect.ValueOf(r).Field(i).SetInt(465)
reflect.ValueOf(r).Field(i).SetInt(i64)
आतंक: reflect.Value · SetInt unaddressable मूल्य
का उपयोग कर
@peterSO द्वारा निर्देश नीचे पूरी तरह से और उच्च गुणवत्ता
चार कर रहे हैं। इस काम करता है:
reflect.ValueOf(&r).Elem().Field(i).SetInt(i64)
वह भी दस्तावेजों कि फ़ील्ड नाम निर्यात नहीं किया जा चाहिए
निकटतम उदाहरण जो मैं ढूंढ सकता था डेटा सेट करने के लिए 'प्रतिबिंबित' का उपयोग करने वाला कोई व्यक्ति http://comments.gmane.org/gmane.comp.lang.go.general/35045 था, लेकिन यहां तक कि वहां उन्होंने वास्तविक गंदे काम करने के लिए 'json.Unmarshal' का उपयोग किया –
(उपर्युक्त टिप्पणी अप्रचलित है) –