पॉइंटर्स कई कारणों से उपयोगी हैं। पॉइंटर्स मेमोरी लेआउट पर नियंत्रण की अनुमति देते हैं (सीपीयू कैश की दक्षता को प्रभावित करता है)। गो में हम एक संरचना को परिभाषित कर सकते हैं जहाँ सभी सदस्य सन्निहित स्मृति में हैं:
type Point struct {
x, y int
}
type LineSegment struct {
source, destination Point
}
इस मामले में Point
संरचना के भीतर संरचनाएं अंतर्निहित हैं LineSegment
। लेकिन आप हमेशा सीधे डेटा एम्बेड नहीं कर सकते। यदि आप बाइनरी ट्री या लिंक्ड सूची जैसी संरचनाओं का समर्थन करना चाहते हैं, तो आपको किसी प्रकार के सूचक का समर्थन करने की आवश्यकता है।
type TreeNode {
value int
left *TreeNode
right *TreeNode
}
Java, Python आदि को यह समस्या नहीं है क्योंकि यह आपको समग्र प्रकारों को एम्बेड करने की अनुमति नहीं देता है, इसलिए एम्बेडिंग और पॉइंटिंग के बीच वाक्यविन्यास अंतर करने की कोई आवश्यकता नहीं है।
गो पॉइंटर्स के साथ स्विफ्ट / सी # स्ट्रक्चर वाले मुद्दे हल किए गए
एक संभावित विकल्प ही पूरा करने के लिए के बीच अंतर करने के लिए है struct
और class
सी # और स्विफ्ट करता है। लेकिन इसकी सीमाएं हैं। यद्यपि आप आमतौर पर निर्दिष्ट कर सकते हैं कि कोई फ़ंक्शन संरचना की inout
प्रतिलिपि बनाने से बचने के लिए पैरामीटर के रूप में एक संरचना लेता है , तो यह आपको संदर्भों (पॉइंटर्स) को संरचित करने की अनुमति नहीं देता है। इसका मतलब यह है कि आप एक संरचना को संदर्भ प्रकार के रूप में कभी नहीं मान सकते हैं जब आप एक पूल आवंटनकर्ता बनाने के लिए उस उपयोगी उदाहरण को पाते हैं (नीचे देखें)।
कस्टम मेमोरी एलोकेटर
पॉइंटर्स का उपयोग करके आप अपना पूल आवंटनकर्ता भी बना सकते हैं (यह केवल सिद्धांत दिखाने के लिए हटाए गए बहुत सारे चेक के साथ सरल है):
type TreeNode {
value int
left *TreeNode
right *TreeNode
nextFreeNode *TreeNode; // For memory allocation
}
var pool [1024]TreeNode
var firstFreeNode *TreeNode = &pool[0]
func poolAlloc() *TreeNode {
node := firstFreeNode
firstFreeNode = firstFreeNode.nextFreeNode
return node
}
func freeNode(node *TreeNode) {
node.nextFreeNode = firstFreeNode
firstFreeNode = node
}
दो मूल्यों को स्वैप करें
पॉइंटर्स आपको लागू करने की अनुमति भी देते हैं swap
। यह दो चर के मानों की अदला-बदली कर रहा है:
func swap(a *int, b *int) {
temp := *a
*a = *b
*b = temp
}
निष्कर्ष
जावा कभी भी Google जैसे स्थानों पर सिस्टम प्रोग्रामिंग के लिए C ++ को पूरी तरह से बदलने में सक्षम नहीं हुआ है, क्योंकि मेमोरी लेआउट और उपयोग को नियंत्रित करने की क्षमता की कमी (कैश मिसेज प्रदर्शन को काफी प्रभावित करता है) के कारण प्रदर्शन को उसी विस्तार से नहीं जोड़ा जा सकता है। गो ने कई क्षेत्रों में C ++ को प्रतिस्थापित करने का लक्ष्य रखा है और इस तरह उसे संकेत का समर्थन करने की आवश्यकता है।