2010-01-20 7 views
20

मैं this पढ़ लिया है, लेकिन अभी भी पूरी तरह से array तो के खिलाफ slice का लाभ के बारे में पता नहीं मैं में किसी की उम्मीद कर रहा हूँ ताकि यह तुलना में बेहतर समझाने और मुझे यकीन है कि आपगो में स्लाइस प्रकार का बिंदु क्या है?

उत्तर

17

स्लाइसों में सरणी पर बहुत सारे उपयोग हैं, जिनमें से कई पोस्टर पहले से ही उल्लेख कर चुके हैं।

  • स्लाइस पॉइंटर्स जैसे कई तरीकों से संचालित हो सकते हैं।
    • एकाधिक स्लाइस कर सकते हैं एक ही आधार सरणी
    • स्लाइस संदर्भ द्वारा पारित कर रहे हैं, लेकिन जब से एक टुकड़ा ही एक सूचक है कि यह "सरणियों" बहुत चारों ओर और अधिक कुशलता से पारित करने के लिए इस्तेमाल किया जा सकता करने के लिए "बिंदु" पूरे सरणी के बाद से कॉपी करने की आवश्यकता नहीं है।
  • हालांकि, संकेत के विपरीत, स्लाइस अतिरिक्त बफर सुरक्षा
    • स्लाइस underflows प्रदान करते हैं और अतिप्रवाह बल्कि आप स्मृति के अन्य क्षेत्रों तक पहुँचने के लिए एक असुरक्षित क्षमता देने से, अपवाद ट्रिगर।
    • स्लाइस आपको सरणी के केवल कुछ क्षेत्रों तक पहुंच सीमित करने की अनुमति देता है। यह सबसेट के साथ काम करने में बेहद उपयोगी हो सकता है।
  • स्लाइस की लंबाई रनटाइम पर गतिशील रूप से निर्धारित की जाती है, ऐसे सरणी के विपरीत जो उनके आकार संकलित समय पर तय होते हैं। इसके अलावा, रनटाइम पर स्लाइसों का गतिशील रूप से आकार बदल सकता है।
12

कर सकते हैं :) go में हूँ, सरणियों मूल्य द्वारा पारित कर रहे हैं ; इसलिए, "संदर्भ से गुजरने" के लिए, आप एक टुकड़ा का उपयोग करते हैं। और अभी यह समाप्त नहीं हुआ है! का हवाला देते हुए जाओ के tutorial:

सरणी का आकार इसके प्रकार का हिस्सा है; हालांकि, कोई एक टुकड़ा वैरिएबल घोषित कर सकता है, जिसमें पॉइंटर को तत्व प्रकार के साथ किसी भी सरणी में या अधिक सामान्य रूप से फ़ॉर्म की स्लाइस अभिव्यक्ति [निम्न: उच्च] का प्रतिनिधित्व करने के लिए निर्दिष्ट किया जा सकता है, जो कि प्रतिनिधित्व करता है subarray उच्च -1 के माध्यम से कम से कम अनुक्रमित। स्लाइस एरे की तरह बहुत कुछ दिखता है लेकिन स्पष्ट आकार ([] बनाम [10]) नहीं है और वे अंतर्निहित, अक्सर अज्ञात, नियमित सरणी के खंड को संदर्भित करते हैं। एकाधिक स्लाइस डेटा साझा कर सकते हैं अगर वे उसी सरणी के टुकड़े का प्रतिनिधित्व करते हैं; एकाधिक सरणी डेटा साझा नहीं कर सकते हैं।

स्लाइस नियमित एरे की तुलना में गो प्रोग्राम में अधिक आम हैं; वे अधिक लचीला हैं, संदर्भ अर्थशास्त्र है, और कुशल हैं। में उनकी नियमित कमी के संग्रहण लेआउट का सटीक नियंत्रण नहीं है; यदि आप के एक सौ तत्व चाहते हैं जो आपकी संरचना के भीतर संग्रहीत एक सरणी है, आपको नियमित सरणी का उपयोग करना चाहिए।

फ़ंक्शन में सरणी पास करते समय, आप लगभग हमेशा औपचारिक पैरामीटर को एक टुकड़ा घोषित करना चाहते हैं। जब आप फ़ंक्शन को कॉल करते हैं, तो सरणी के पते को ले जाएं और जाओ एक स्लाइस संदर्भ बनाएं (कुशलतापूर्वक) बनाएं और उसे पास करें।

+0

जब आप स्लाइस में कुछ जोड़ते हैं तो सावधान रहें, आपने एक नया संदर्भ बनाया: ए = संलग्न (ए, कुछ)। इस लिंक के उदाहरण आगे बता सकते हैं: http://play.golang.org/p/5c4PyzDOzb –

3

स्लाइस, एक, संदर्भित तक पहुँचने, और पूरे सरणी को कॉपी किए बिना एक सरणी के सटे भागों परिवर्तनशील (वस्तुओं और सरणियों के बाद से मूल्य से पारित कर रहे हैं), या सरणी के लिए एक सूचक पास करने का एक सुरक्षित, कारगर तरीका प्रदान करते हैं सूचकांक शुरू करें, और एक लंबाई।

0

पहले से दिए गए उत्तरों के अतिरिक्त, सरणी गतिशील रूप से आकार में हो सकती है जबकि सरणी नहीं हो सकती है। यही है, आप केवल एक सरणी के आकार को निर्दिष्ट करने के लिए स्थिरांक का उपयोग कर सकते हैं, जबकि आप एक स्लाइस के आकार को निर्दिष्ट करने के लिए एक चर का उपयोग कर सकते हैं।

2

मुझे लगता है कि स्लाइस और सरणी को गो ब्लॉग पर this post में अधिक बेहतर और अधिक विस्तार से वर्णित किया गया है।

संबंधित मुद्दे