ماڈیول اسباق (2/5)
سلائسس: محاوراتی ساخت
ایک ٹکڑا گو میں سب سے زیادہ استعمال ہونے والا ڈیٹا ڈھانچہ ہے: ایک متحرک منظر
ایک بنیادی صف پر۔ نحو: []T۔ صفوں کے برعکس، لمبائی ہے۔
قسم کا حصہ نہیں ہے، اور آپ اسے append کے ساتھ بڑھا سکتے ہیں۔
ایک ٹکڑے کی اناٹومی ۔
اندرونی طور پر ایک ٹکڑا تین فیلڈ ڈھانچہ ہے:
- بنیادی صف میں پہلے عنصر کی طرف ایک پوائنٹر
- ایک لمبائی (
len): مرئی عناصر کی تعداد - ایک صلاحیت (
cap): منظر کے آغاز سے دستیاب عناصر بنیادی صف کے آخر تک
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3تخلیق
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 appendappend: ہمیشہ نتیجہ تفویض کریں۔
append عناصر کو شامل کرتا ہے اور ایک نیا ٹکڑا لوٹاتا ہے (ممکنہ طور پر
اگر صلاحیت ناکافی ہے تو ایک نئی صف مختص کرنا):
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 (خصوصی) تک ایک ذیلی سلائس نکالتا ہے:
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
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!ایک آزاد کاپی حاصل کرنے کے لیے، استعمال کریں copy یا append:
out := make([]int, len(sub))
copy(out, sub)اسے آزمائیں
[1، 2، 3] کے ساتھ ایک سلائس بنائیں اور 4 کو شامل کرنے کے لیے ضمیمہ کا استعمال کریں۔
اشارہ دکھائیں۔
ہمیشہ 's' میں واپس ضمیمہ کا نتیجہ تفویض کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
انڈیکس 1 سے 3 خصوصی تک عناصر کو نکالنے کے لیے ایک سلائس ایکسپریشن کا استعمال کریں (یعنی [20، 30])۔
اشارہ دکھائیں۔
نحو: `s[start:end]`, `start` inclusive, `end` exclusive۔
3 کوششوں کے بعد حل دستیاب ہے۔
ان میں سے کون سا لکھنا غلط ہے؟
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سلائس = پڑھنے/رینج/ضمیمے کے لیے ٹھیک ہے؛ صفر کے نقشے سے بالکل مختلف۔