مرکزی مواد پر جائیں
ماڈیول 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 میں بھی نظر آتی ہیں۔

Pitfall: array shareing

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` inclusive, `end` exclusive۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m4.l2.e3
تیار

ان میں سے کون سا لکھنا غلط ہے؟

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
جواب کے اختیارات

Recap

  • []T: ایک صف پر متحرک منظر؛ ٹرپل (ptr، لین، ٹوپی)۔
  • make([]T, len, cap) پہلے سے مختص کرنے کے لیے؛ var s []T قابل استعمال صفر سلائس کے لیے۔
  • s = append(s, ...): ہمیشہ نتیجہ تفویض کریں۔
  • s[a:b] بنیادی صف کا اشتراک کرتا ہے: copy(...) آزاد کاپیوں کے لیے۔
  • ایک nil سلائس = پڑھنے/رینج/ضمیمے کے لیے ٹھیک ہے؛ صفر کے نقشے سے بالکل مختلف۔