मुझे लगता है कि यह इंगित करना और जानना महत्वपूर्ण है कि यदि गंतव्य स्लाइस (आप जिस स्लाइस में संलग्न हैं) में पर्याप्त क्षमता है, तो अपेंडिस "इन-प्लेस" होगा, डेस्टीनेशन को (reslicing) बढ़ाने के बढ़ाने का इसकी लंबाई करने के लिए) उपयुक्त तत्वों को समायोजित करने में सक्षम)।
इसका मतलब यह है कि यदि गंतव्य एक बड़े सरणी या स्लाइस को बनाकर बनाया गया था जिसके परिणामस्वरूप टुकड़ा की लंबाई से परे अतिरिक्त तत्व हैं, तो वे अधिलेखित हो सकते हैं।
प्रदर्शित करने के लिए, इस उदाहरण को देखें:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
आउटपुट (इसे खेल के मैदान पर आज़माएं ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
हमने aलंबाई के साथ एक "बैकिंग" सरणी बनाई 10। फिर हम xइस aएरे को स्लाइस करके डेस्टिनेशन स्लाइस बनाते हैं , yकंपोजिट शाब्दिक का उपयोग करके स्लाइस बनाया जाता है []int{3, 4}। अब जब हम yकरने के लिए अपील करते हैं x, तो परिणाम अपेक्षित है [1 2 3 4], लेकिन क्या आश्चर्य की बात हो सकती है कि बैकिंग सरणी aभी बदल गई है, क्योंकि क्षमता xहै 10जो yइसे जोड़ने के लिए पर्याप्त है , इसलिए xइसे हटा दिया गया है जो उसी aबैकिंग सरणी का उपयोग करेगा , औरappend() के तत्वों की नकल करेंगेy वहाँ के ।
यदि आप इससे बचना चाहते हैं, तो आप एक पूर्ण स्लाइस अभिव्यक्ति का उपयोग कर सकते हैं जिसका स्वरूप है
a[low : high : max]
जो एक स्लाइस का निर्माण करता है और इसके द्वारा निर्धारित स्लाइस की क्षमता को भी नियंत्रित करता है max - low ।
संशोधित उदाहरण देखें (केवल अंतर यह है कि हम xइस तरह बनाते हैं x = a[:2:2]:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
आउटपुट (इसे खेल के मैदान पर आज़माएं )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
जैसा कि आप देख सकते हैं, हम एक ही xपरिणाम प्राप्त करते हैं, लेकिन बैकिंग सरणी aनहीं बदली, क्योंकि क्षमता xकेवल "थी" 2(पूर्ण टुकड़ा अभिव्यक्ति के लिए धन्यवाद a[:2:2])। तो एपेंड करने के लिए, एक नया बैकिंग एरे आवंटित किया जाता है जो दोनों के तत्वों को संग्रहीत कर सकता है xऔर y, जो अलग है a।
append()एक चर समारोह, और...आप एक स्लाइस से एक चर समारोह के लिए कई तर्क पारित करने देता है।