गोलंग सीजीओ में यूनियन फील्ड्स को गो टाइप में परिवर्तित करना
गोलंग सीजीओ में सी संरचनाओं के साथ काम करते समय, यूनियन फील्ड्स तक पहुंच एक चुनौती हो सकती है। एक सामान्य परिदृश्य में सी संरचना के भीतर एक मूल्य संघ में ui32v फ़ील्ड तक पहुंच शामिल है, जैसा कि निम्नलिखित उदाहरण में है:
struct _GNetSnmpVarBind {
guint32 *oid; /* name of the variable */
gsize oid_len; /* length of the name */
GNetSnmpVarBindType type; /* variable type / exception */
union {
gint32 i32; /* 32 bit signed */
guint32 ui32; /* 32 bit unsigned */
gint64 i64; /* 64 bit signed */
guint64 ui64; /* 64 bit unsigned */
guint8 *ui8v; /* 8 bit unsigned vector */
guint32 *ui32v; /* 32 bit unsigned vector */
} value; /* value of the variable */
gsize value_len; /* length of a vector in bytes */
};
नोट: इस उदाहरण में, हम 64-बिट प्लेटफॉर्म पर हैं।
विफल दृष्टिकोण: uint64 में कनवर्ट करना और कास्टिंग करना
एक प्रारंभिक दृष्टिकोण में यूनियन फ़ील्ड की सामग्री को uint64 में परिवर्तित करना शामिल हो सकता है, यह मानते हुए कि यह एक मेमोरी एड्रेस का प्रतिनिधित्व करता है, और फिर उस uint64 को *_Ctype_guint32 में कास्टिंग करना शामिल हो सकता है। हालाँकि, इस दृष्टिकोण के परिणामस्वरूप एक प्रकार की रूपांतरण त्रुटि होगी।
सही दृष्टिकोण: संघ के पते का उपयोग करना
इसके बजाय, सही दृष्टिकोण में संघ के पते का उपयोग करना शामिल है संघ ही. सीजीओ में, एक यूनियन को अपने सबसे बड़े सदस्य को रखने के लिए पर्याप्त बड़े बाइट सरणी के रूप में प्रदर्शित किया जाता है। इस मामले में, वह सरणी आठ बाइट्स ([8]बाइट) है। इस सरणी के पते का उपयोग करके, हम इसे सीधे वांछित प्रकार में डाल सकते हैं। = *(**C.guint32)(unsafe.Pointer(&data.value[0]))
कोड का टूटना:guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))
&data. वैल्यू[0] वैल्यू यूनियन में पहले बाइट का पता प्राप्त करता है।unsafe.Pointer(&data.value[0]) इस पते को असुरक्षित.पॉइंटर प्रकार के पॉइंटर में परिवर्तित करता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3