मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 2 का 5पाठ्यक्रम में 17/50~15 min
मॉड्यूल पाठ (2/5)

स्लाइस: मुहावरेदार संरचना

गो में स्लाइस सबसे अधिक उपयोग की जाने वाली डेटा संरचना है: एक डायनामिक दृश्य एक अंतर्निहित सरणी पर। सिंटैक्स: []T. सरणियों के विपरीत, लंबाई है प्रकार का हिस्सा नहीं है, और आप इसे append के साथ विकसित कर सकते हैं।

एक टुकड़े की शारीरिक रचना

आंतरिक रूप से एक स्लाइस एक तीन-क्षेत्रीय संरचना है:

  • अंतर्निहित सरणी में पहले तत्व के लिए एक पॉइंटर
  • एक लंबाई (len): दृश्यमान तत्वों की संख्या
  • एक क्षमता (cap): दृश्य की शुरुआत से उपलब्ध तत्व अंतर्निहित सरणी के अंत तक
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

निर्माण

Go
a := []int{1, 2, 3}          // literal
b := make([]int, 3)          // [0 0 0]   len=3 cap=3
c := make([]int, 3, 10)      // len=3 cap=10 (reserved)
var d []int                  // nil slice: len=0 cap=0, still usable with append

append: हमेशा परिणाम निर्दिष्ट करें

append तत्व जोड़ता है और एक नया स्लाइस लौटाता है (संभवतः यदि क्षमता अपर्याप्त है तो एक नई सरणी आवंटित करना):

Go
s := []int{1, 2, 3}
s = append(s, 4)              // [1 2 3 4]
s = append(s, 5, 6, 7)        // append multiple elements
s = append(s, altra...)       // concatenate another slice (spread)

स्लाइस अभिव्यक्ति s[a:b]

a (समावेशी) से b (अनन्य) तक एक उप-स्लाइस निकालता है:

Go
s := []int{10, 20, 30, 40, 50}
sub := s[1:4]              // [20 30 40]
inizio := s[:2]            // [10 20]
fine := s[3:]              // [40 50]
intera := s[:]             // [10 20 30 40 50]

उप-स्लाइस अंतर्निहित सरणी को मूल स्लाइस के साथ साझा करें: sub[i] = ... के माध्यम से उत्परिवर्तन s में भी दिखाई देते हैं।

ख़तरा: सरणी साझाकरण

Go
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s)             // [99 2 3 4] — modified!

एक स्वतंत्र प्रति प्राप्त करने के लिए, copy या append का उपयोग करें:

Go
out := make([]int, len(sub))
copy(out, sub)

इसे अजमाएं

व्यायाम#go.m4.l2.e1
प्रयास: 0लोड हो रहा है...

[1, 2, 3] के साथ एक स्लाइस बनाएं और 4 जोड़ने के लिए एपेंड का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

हमेशा `s` में वापस जोड़ने का परिणाम निर्दिष्ट करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m4.l2.e2
प्रयास: 0लोड हो रहा है...

इंडेक्स 1 समावेशी से 3 एक्सक्लूसिव (यानी [20, 30]) तक तत्वों को निकालने के लिए स्लाइस एक्सप्रेशन का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

सिंटैक्स: `s[start:end]`, `start` समावेशी, `end` अनन्य।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m4.l2.e3
तैयार

इनमें से क्या लिखना ग़लत है?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
उत्तर विकल्प

संक्षिप्त

  • []T: किसी सरणी पर गतिशील दृश्य; ट्रिपल (पीटीआर, लेन, कैप)।
  • make([]T, len, cap) पूर्व-आवंटन के लिए; प्रयोग करने योग्य शून्य स्लाइस के लिए var s []T।
  • s = append(s, ...): हमेशा परिणाम निर्दिष्ट करें।
  • s[a:b] अंतर्निहित सरणी साझा करता है: स्वतंत्र प्रतियों के लिए copy(...)।
  • एक nil स्लाइस = पढ़ने/रेंज/जोड़ने के लिए ठीक; शून्य मानचित्र से बिल्कुल भिन्न।