2017-01-16 12 views
5

टोपी और golang में एक टुकड़ा का लेन के बीच क्या अंतर है?टोपी golang में टुकड़ा की लेन बनाम

परिभाषा के अनुसार:

एक टुकड़ा दोनों लंबाई और क्षमता है।

एक टुकड़ा की लंबाई तत्वों उसमें शामिल की संख्या है।

एक टुकड़ा की क्षमता अंतर्निहित सरणी में तत्वों की संख्या, टुकड़ा में पहला तत्व से गिनती है।

x := make([]int, 0, 5) // len(b)=0, cap(b)=5 

क्या लेन का मतलब केवल शून्य शून्य है?

+2

क्या आपने पूछने से पहले न्यूनतम मात्रा में शोध किया है? केवल खोजशब्दों के लिए googling निश्चित रूप से [इस विषय पर जाने के लिए लेख] (https://blog.golang.org/go-slices-usage-and-internals) उत्पन्न करेगा जो आपके बारे में पूछे गए सभी बताते हैं। – kostix

उत्तर

0

आप अपने प्रश्न का उत्तर दिया - एक टुकड़ा में अंतर्निहित सरणी की लंबाई जरूरी तत्व है कि सरणी शामिल की संख्या के रूप में ही नहीं है।

0

source code से:

// The len built-in function returns the length of v, according to its type: 
// Array: the number of elements in v. 
// Pointer to array: the number of elements in *v (even if v is nil). 
// Slice, or map: the number of elements in v; if v is nil, len(v) is zero. 
// String: the number of bytes in v. 
// Channel: the number of elements queued (unread) in the channel buffer; 
// if v is nil, len(v) is zero. 
func len(v Type) int 

// The cap built-in function returns the capacity of v, according to its type: 
// Array: the number of elements in v (same as len(v)). 
// Pointer to array: the number of elements in *v (same as len(v)). 
// Slice: the maximum length the slice can reach when resliced; 
// if v is nil, cap(v) is zero. 
// Channel: the channel buffer capacity, in units of elements; 
// if v is nil, cap(v) is zero. 
func cap(v Type) int 
15

एक टुकड़ा एक अमूर्त कवर के तहत एक सरणी का उपयोग करता है है।

cap आप अंतर्निहित सरणी की क्षमता बताता है। len आपको बताता है कि सरणी में कितनी वस्तुएं हैं।

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

उदाहरण:

s := make([]int, 0, 3) 
for i := 0; i < 5; i++ { 
    s = append(s, i) 
    fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s) 
} 

विल उत्पादन कुछ इस तरह:

cap 3, len 1, 0x1040e130 
cap 3, len 2, 0x1040e130 
cap 3, len 3, 0x1040e130 
cap 8, len 4, 0x10432220 
cap 8, len 5, 0x10432220 

एक बार क्षमता पूरा किया जाता है आप देख सकते हैं, append एक बड़ी क्षमता के साथ एक नया टुकड़ा वापस आ जाएगी। चौथे पुनरावृत्ति पर आपको एक बड़ी क्षमता और एक नया सूचक पता दिखाई देगा।

Play example

मैं तुम्हें सरणियों के बारे में पूछने के लिए और संलग्न नहीं किया था एहसास लेकिन वे टुकड़ा और builtins के लिए कारण को समझने में बहुत मूलभूत हैं।

+0

ग्रेट उत्तर। ओपी अब और परवाह नहीं कर सकता है, लेकिन मैं इसे बहुत से लोगों के लिए उपयोगी साबित कर सकता हूं जो इसे सड़क से नीचे पा सकते हैं। –

+0

@RandyHoward धन्यवाद, मैं इसकी सराहना करता हूं। मुझे पता है कि सूचक पता काफी महत्वपूर्ण हो गया है। – jmaloney

+0

@jmaloney। यह बहुत उपयोगी है। एक बात जो मुझे अभी भी समझ में आ रही है वह यह है कि सरणी और स्लाइस के लिए शून्य मान शून्य है (शून्य या शून्य नहीं) तो, क्षमता वास्तव में क्षमता से अलग कैसे हो सकती है। क्षमता 3 के टुकड़े में प्रत्येक तत्व को पहले पुनरावृत्ति में {1,0,0} नहीं होना चाहिए ... लेन को 3 नहीं 1 होना चाहिए? मेरा मतलब है कि यह सिर्फ सम्मेलन है, मैं उस सम्मेलन में तर्क को समझ नहीं पा रहा हूं। क्या मुझे बस कुछ याद आ रहा है या क्या मुझे इसे स्वीकार करना चाहिए? –