स्लाइसिंग: गो में आउट-ऑफ-बाउंड त्रुटि
गो में, स्लाइसिंग में एक नया बनाने के लिए मौजूदा स्लाइस के एक हिस्से को निकालना शामिल है टुकड़ा। जब स्लाइसिंग के दौरान एक आउट-ऑफ-बाउंड त्रुटि होती है, तो यह इंगित करता है कि निर्दिष्ट सीमा स्रोत स्लाइस के लिए मान्य सूचकांक सीमाओं से अधिक है।
निम्न कोड स्निपेट पर विचार करें:
a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[1:] printSlice("c", c)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}
इस कोड को चलाने से एक आउट-ऑफ-बाउंड त्रुटि उत्पन्न होती है:
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 0x150
यह त्रुटि क्यों होती है यह समझने के लिए, हमें गो में स्लाइसिंग को नियंत्रित करने वाले नियमों को समझने की आवश्यकता है।
टुकड़े करना नियम
किसी स्लाइस या सरणी को काटते समय, निर्दिष्ट सूचकांक या तो स्पष्ट या अंतर्निहित हो सकते हैं। यदि कोई सूचकांक स्पष्ट रूप से प्रदान नहीं किया गया है, तो यह एक विशिष्ट मान पर डिफ़ॉल्ट होता है। स्लाइस के लिए:
दिए गए कोड में, त्रुटि उत्पन्न होती है क्योंकि सी स्लाइस बनाने के लिए स्लाइसिंग अभिव्यक्ति है:
c := b[1:]
इसका मतलब है कि निचली सीमा (1) स्पष्ट रूप से निर्दिष्ट है, लेकिन ऊपरी सीमा नहीं है। इसलिए, यह डिफ़ॉल्ट रूप से len(b) है, जो 0 है। हालांकि, निर्दिष्ट निचली सीमा (1) ऊपरी सीमा (0) से के बराबर या उससे कम होनी चाहिए। यह शर्त पूरी नहीं हुई है, जिसके परिणामस्वरूप सीमा से बाहर त्रुटि हुई है।
इस त्रुटि से बचने के लिए, आप निचली और ऊपरी दोनों सीमाओं को स्पष्ट रूप से निर्दिष्ट कर सकते हैं। उदाहरण के लिए, b स्लाइस से केवल दूसरा तत्व निकालने के लिए, आप लिखेंगे:
c := b[1:2] // c len=1 cap=4 [0]
वैकल्पिक रूप से, यदि आप दूसरे तत्व से शुरू करके संपूर्ण बी स्लाइस निकालना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3