"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो के सीजीओ में यूनियन फील्ड्स तक कैसे पहुंचें?

गो के सीजीओ में यूनियन फील्ड्स तक कैसे पहुंचें?

2024-11-06 को प्रकाशित
ब्राउज़ करें:588

How to Access Union Fields in Go\'s CGo?

गोलंग सीजीओ में यूनियन फील्ड्स को गो टाइप में परिवर्तित करना

गोलंग सीजीओ में सी संरचनाओं के साथ काम करते समय, यूनियन फील्ड्स तक पहुंच एक चुनौती हो सकती है। एक सामान्य परिदृश्य में सी संरचना के भीतर एक मूल्य संघ में 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]) इस पते को असुरक्षित.पॉइंटर प्रकार के पॉइंटर में परिवर्तित करता है।

    (**C.guint32)(unsafe.Pointer(&data.value[0])) unsafe.Pointer(&data.value[0]) द्वारा इंगित की गई मेमोरी को **C.guint32 के रूप में व्याख्या करता है, प्रभावी ढंग से ui32v तक पहुंचता है एक guint32 के सूचक के रूप में फ़ील्ड।
  • यह सरलीकृत दृष्टिकोण गो कोड में यूनियन फ़ील्ड तक सीधी पहुंच की अनुमति देता है।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3