मुझे लगता है कि यह इंगित करना और जानना महत्वपूर्ण है कि यदि गंतव्य स्लाइस (आप जिस स्लाइस में संलग्न हैं) में पर्याप्त क्षमता है, तो अपेंडिस "इन-प्लेस" होगा, डेस्टीनेशन को (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()
एक चर समारोह, और...
आप एक स्लाइस से एक चर समारोह के लिए कई तर्क पारित करने देता है।