गो में ऐरे हैंडलिंग
गो में, ऐरे मूल्य प्रकार हैं, और एक ऐरे को दूसरे में असाइन करने से उसके सभी तत्वों की एक प्रति बन जाती है। यह किसी फ़ंक्शन में सरणी पास करते समय भी सत्य है, क्योंकि इसे मेमोरी संदर्भ के बजाय एक प्रतिलिपि प्राप्त होगी।
मूल प्रश्न
के संबंध में एक प्रश्न उठाया गया था निम्नलिखित कोड:
package main
import (
"fmt"
"rand"
"time"
)
func shuffle(arr []int) {
rand.Seed(time.Nanoseconds())
for i := len(arr) - 1; i > 0; i-- {
j := rand.Intn(i)
arr[i], arr[j] = arr[j], arr[i]
}
}
func main() {
arr := []int{1, 2, 3, 4, 5}
arr2 := arr
shuffle(arr)
for _, i := range arr2 {
fmt.Printf("%d ", i)
}
}
लेखक ने इस बात पर भ्रम व्यक्त किया कि arr2 और arr के अलग-अलग इकाई होने की उनकी अपेक्षा के बावजूद, arr2 शफ़ल फ़ंक्शन से प्रभावित क्यों हुआ।
स्पष्टीकरण
यह समस्या सरणियों और स्लाइस के बीच गलतफहमी से उत्पन्न होती है।
सरणी बनाम स्लाइस
सरणी मानों का निश्चित-लंबाई संग्रह हैं, जबकि स्लाइस अंतर्निहित सरणी के गतिशील संदर्भ हैं। दिए गए कोड उदाहरण में, किसी सारणी का उपयोग नहीं किया गया है। एक अनाम अंतर्निहित सरणी को संदर्भित करते हुए एक स्लाइस बनाता है। बाद की arr2 := arr लाइन बस इस संदर्भ को डुप्लिकेट करती है, जिसके परिणामस्वरूप arr और arr2 दोनों एक ही अंतर्निहित सरणी की ओर इशारा करते हैं।
फ़ंक्शन व्यवहार
जब arr को पास किया जाता है शफ़ल फ़ंक्शन, स्लाइस की एक प्रति बनाई जाती है, अंतर्निहित सरणी की नहीं। इस प्रतिलिपि को फ़ंक्शन द्वारा संशोधित किया गया है, यही कारण है कि arr संशोधित होने पर arr2 भी प्रभावित होता है।
निष्कर्ष
गो में, स्लाइस अंतर्निहित सरणियों के संदर्भ के रूप में व्यवहार करते हैं। एक स्लाइस को दूसरे स्लाइस को असाइन करने से संदर्भ की प्रतिलिपि बनती है, अंतर्निहित सरणी की नहीं। गो में स्लाइस हेरफेर को समझने के लिए यह अवधारणा महत्वपूर्ण है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3