reflection - How do you loop through the fields in a Golang struct to get and set values in an extensible way? -
मेरे पास एक स्ट्रक्चर व्यक्ति है।
प्रकार व्यक्ति संरचना {प्रथमनाम स्ट्रिंग अंतिम नाम स्ट्रिंग वर्ष यूआईटी 8 }
फिर मेरे पास इस संरचना, व्यक्तित्व और व्यक्ति के दो उदाहरण हैं।
PersonA: = {"", "ओबामा", 6} व्यक्ति: = {"राष्ट्रपति", "कार्टर", 8}
मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो कि प्रत्येक क्षेत्र (यानी खाली-खाली) के लिए किसी शर्त को व्यक्त करने के लिए PersonA से PersonB के मूल्यों की प्रतिलिपि बनाता है। मुझे यह पता है कि क्षेत्र के नाम को कड़ी मेहनत से कैसे करना है, लेकिन मैं एक फ़ंक्शन चाहूंगा जो काम करता है, भले ही मैं व्यक्ति संरचना को बदलूं
मुझे पता है कि जाओ प्रतिबिंब उपयोगी है, लेकिन समस्या मिल रही है और मूल्यों को सेट करने के लिए प्रकार जानना आवश्यक है, यदि आप SetInt जैसे कुछ का उपयोग करना चाहते हैं लेकिन क्या ऐसा करने के लिए "सरल" तरीका है?
** जावास्क्रिप्ट सादृश्य ** जावास्क्रिप्ट में, आप बस (कुछ ऑब्जेक्ट में संपत्ति के लिए) के माध्यम से पाश को कर सकते हैं।
(personA में propt के लिए) {if personA [Propt]! = "" {/} कुछ व्यक्ति बी [propt] = व्यक्ति [[propt]}}
विकल्प मैंने अस्वीकार किया है:
-
प्रत्येक मैट्रिक में फ़ील्ड का ट्रैक रखते हुए, फिर FieldByName के संयोजन का उपयोग करके और सेट * फ़ंक्शंस का संग्रह।
-
व्यक्ति के क्षेत्रों के माध्यम से मैन्युअल रूप से (नीचे) लूप बनाना क्योंकि मैं कई अन्य structs (स्कूल, पशु, आदि ...) के लिए इस तरह के "अद्यतन" करना चाहता हूं
अगर PersonA.Firstname! = "" {PersonB.Firstname = PersonA। प्रथमनाम}
...
<पूर्व>अगर PersonA.Years! = "" {PersonB.Years = PersonA.Years}
नीचे दिए गए सवाल मुझे वहां आधे रास्ते पर ले जाते हैं, लेकिन अभी भी सभी structs के लिए एक्स्टेंसिबल नहीं है जिसके लिए मैं इस "अद्यतन" फ़ंक्शन का उपयोग करना चाहता हूं।
** अन्य सहायक लिंक **
यहां एक समाधान है f2.Set (प्रतिबिंबित करें। मूल्य (एफ))
यहां कुंजी है
पैकेज मुख्य आयात ("एफएमटी" "प्रतिबिंबित") फ़ंक्शन मुख्य ( ) {प्रकार टी संरचना {एक पूर्णांक बी स्ट्रिंग} टी: = टी {23, "स्किडू"} टी 2: = टी {} s: = प्रतिबिंबित करें। ValuOf (& amp; t)। एलेम () s2: = प्रतिबिंबित करें। ValueOf ( और amp; टी 2)। एलीम () प्रकारओफ़टी: = s.Type () fmt.Println ("टी =", टी) fmt.Println ("टी 2 =", टी 2) i: = 0 के लिए; मैं & lt; s.NumField (); I ++ {f: = s.Field (i) f2: = s2.Field (i) fmt.printf ("% d:% s% s =% v \ n", मैं, प्रकार ओफ़टी.फ़िल्ड (i) .नाम, F.Type (), f.Interface ()) fmt.Printf ("% d:% s% s =% v \ n", i, typeOfT.Field (i) .नाम, f2.Type (), f2। इंटरफ़ेस ()) f2.Set (प्रतिबिंबित करें। मूल्य (एफ)) fmt.printf ("% d:% s% s =% v \ n", i, typeOfT.Field (i) .नाम, f2.Type () , F2.Interface ())} fmt.Println ("टी =", टी) fmt.Println ("t2 =", टी 2)} आउटपुट: टी = {23 skidoo} टी 2 = {0} 0: एक int = 23 0: एक पूर्णांक = 0 0: ए int = 23 1: बी स्ट्रिंग = स्किडू 1: बी स्ट्रिंग = 1: बी स्ट्रिंग = स्किडू टी = {23 स्किडु} टी 2 = {23 स्किडू}
< P>
Comments
Post a Comment