मैंने यह सवाल कुछ महीने पहले पूछा था, जब मैंने पहली बार गो की जांच शुरू की थी। तब से, हर दिन मैं गो के बारे में पढ़ रहा हूं, और गो में कोडिंग कर रहा हूं।
क्योंकि मुझे इस प्रश्न का स्पष्ट उत्तर नहीं मिला (हालाँकि मैंने एक उत्तर को स्वीकार कर लिया था) अब मैं इसका उत्तर खुद देने जा रहा हूँ, जो मैंने सीखा है, उसके आधार पर:
क्या हार्ड कोडित सरणी आकार के बिना Go में एक सरणी / स्लाइस बनाने का एक तरीका है?
हाँ। स्लाइस के लिए कठोर कोडित सरणी की आवश्यकता नहीं है slice
:
var sl []int = make([]int,len,cap)
यह कोड स्लाइस आवंटित करता है sl
, len
जिसकी क्षमता है cap
- len
और cap
वे चर हैं जिन्हें रनटाइम पर सौंपा जा सकता है।
क्यों list.List
नजरअंदाज किया जाता है?
ऐसा लगता है कि मुख्य कारणों list.List
में गो पर थोड़ा ध्यान दिया जाता है:
जैसा कि @ निक क्रेग-वुड के उत्तर में बताया गया है, वस्तुतः कुछ भी नहीं है जो सूचियों के साथ किया जा सकता है जो स्लाइस के साथ नहीं किया जा सकता है, अक्सर अधिक कुशलता से और क्लीनर के साथ, अधिक सुरुचिपूर्ण वाक्यविन्यास। उदाहरण के लिए रेंज का निर्माण:
for i:=range sl {
sl[i]=i
}
सूची के साथ उपयोग नहीं किया जा सकता है - लूप के लिए एक सी शैली की आवश्यकता है। और कई मामलों में, सी ++ संग्रह शैली वाक्यविन्यास का उपयोग सूचियों के साथ किया जाना चाहिए:
push_back
आदि।
शायद अधिक महत्वपूर्ण बात, list.List
दृढ़ता से टाइप नहीं किया गया है - यह पायथन की सूचियों और शब्दकोशों के समान है, जो संग्रह में विभिन्न प्रकारों को एक साथ मिलाने की अनुमति देते हैं। यह चीजों के लिए गो दृष्टिकोण के विपरीत चलता है। जाओ एक बहुत दृढ़ता से टाइप किया भाषा है - उदाहरण के लिए, अंतर्निहित प्रकार रूपांतरण, गो में अनुमति कभी नहीं से भी एक Upcast int
को int64
स्पष्ट किया जाना चाहिए। लेकिन सूची के लिए सभी तरीके हैं। खाली इंटरफेस लेते हैं - कुछ भी हो जाता है।
पायथन को छोड़ने और गो में चले जाने के कारणों में से एक पायथन के प्रकार प्रणाली में इस तरह की कमजोरी के कारण है, हालांकि पायथन "दृढ़ता से टाइप" होने का दावा करता है (आईएमओ यह नहीं है)। गो list.List
को एक तरह का "मोंगरेल" लगता है, जो कि C ++ के vector<T>
और पायथन के
जन्म का है List()
, और शायद गो में ही एक जगह से थोड़ा बाहर है।
यह मुझे आश्चर्यचकित नहीं करेगा यदि बहुत दूर के भविष्य में कुछ बिंदु पर, हम सूची पाते हैं। जाओ में पदावनत, हालांकि शायद यह रहेगा, उन दुर्लभ स्थितियों को समायोजित करने के लिए , जहां अच्छी डिजाइन प्रथाओं का उपयोग करते हुए, एक समस्या को सबसे अच्छा हल किया जा सकता है। एक संग्रह के साथ जो विभिन्न प्रकारों को रखता है। या शायद यह सी परिवार के डेवलपर्स के लिए गो के साथ सहज होने के लिए "पुल" प्रदान करना है इससे पहले कि वे स्लाइस की बारीकियों को सीखें, जो गो, एएफएआईके के लिए अद्वितीय हैं। (कुछ मामलों में स्लाइस सी ++ या डेल्फी में स्ट्रीम कक्षाओं के समान हैं, लेकिन पूरी तरह से नहीं।)
हालाँकि, डेल्फी / सी ++ / पायथन बैकग्राउंड से आने के बाद, गो के अपने शुरुआती प्रदर्शन में मुझे list.List
गो के स्लाइस की तुलना में अधिक परिचित पाया गया, क्योंकि मैं गो के साथ अधिक सहज हो गया हूं, मैं वापस चला गया हूं और अपनी सभी सूचियों को स्लाइस में बदल दिया। मुझे अभी तक कुछ भी नहीं मिला है slice
और / या map
मुझे ऐसा करने की अनुमति नहीं है, जैसे मुझे उपयोग करने की आवश्यकता है list.List
।
list
लिंक की गई सूची का उपयोग करके पायथन का प्रकार लागू नहीं किया गया है: यह गो स्लाइस के समान व्यवहार करता है, कभी-कभी विस्तार के लिए डेटा प्रतियों की आवश्यकता होती है।