فهم Third Index در Subslice های Go
در Go وقتی از اسلایس یک subslice میگیریم، معمولاً دو نوع سینتکس داریم:
1️⃣ حالت اول: slice[low:high]
طول (len) = high - low
ظرفیت (cap) = cap(slice) - low
مثال:
نکته: تا زمانی که len به cap نرسه، گو دست به زحمت برای ایجاد یک اسلایس جدید نمیکنه. اما وقتی بگذره همه عناصرو برمیداره و دوباره یه جای مموری میبره که جا برای عناصر جدید باشه.
همچنین این رو هم باید بدونیم y بخشی از x هست. یعنی اگه y سهم [1:3] از اسلایس x رو داشته باشه، تغییرات روی y روی x هم میشینه. یا بهتر بگم Reference داره.
اما شاید بخواییم از این رفتار جلوگیری کنیم. حالا چطور؟
2️⃣ با slice[low:high:max]
طول (len) = high - low
ظرفیت (cap) = max - low
مثال:
حالا y ظرفیت محدودتری دارد.
اگر append از این ظرفیت فراتر بره حتماً یک آرایه مستقل ایجاد میشه. ولی باز هم اگه قبل مستقل شدنش تغییری روی subslice بدید روی slice هم میشینه. ولی اگه len به cap برسه با خیال راحت میتونید دیگه تغییرات بدید. چون دیگه تحت سلطه x نیست🤣.
💡 نکته: به طور خلاصه استفاده از third index یه راه ساده برای جلوگیری از تغییر ناخواسته والد هنگام append هست.
برای اینکه مطمئن از این رفتار بشید، این دو کد رو به دقت بررسی کنید.
https://go.dev/play/p/E5kILltOzrb
https://go.dev/play/p/UaIsqsxQkku
توی لینک دوم از third index برای جلوگیری از تغییر ناخواسته استفاده میکنیم.
منبع: کتاب Learning Go
#go #third_index
☕️ Telegram | Website | Discord
در Go وقتی از اسلایس یک subslice میگیریم، معمولاً دو نوع سینتکس داریم:
slice[low : high]
slice[low : high : max]
1️⃣ حالت اول: slice[low:high]
طول (len) = high - low
ظرفیت (cap) = cap(slice) - low
مثال:
x := []int{1, 2, 3, 4, 5}
y := x[1:3] // 2 3
fmt.Println(len(y), cap(y)) // 2, 4
نکته: تا زمانی که len به cap نرسه، گو دست به زحمت برای ایجاد یک اسلایس جدید نمیکنه. اما وقتی بگذره همه عناصرو برمیداره و دوباره یه جای مموری میبره که جا برای عناصر جدید باشه.
همچنین این رو هم باید بدونیم y بخشی از x هست. یعنی اگه y سهم [1:3] از اسلایس x رو داشته باشه، تغییرات روی y روی x هم میشینه. یا بهتر بگم Reference داره.
اما شاید بخواییم از این رفتار جلوگیری کنیم. حالا چطور؟
2️⃣ با slice[low:high:max]
طول (len) = high - low
ظرفیت (cap) = max - low
مثال:
x := []int{1, 2, 3, 4, 5}
y := x[1:3:3] // عناصر دوم و سوم، حداکثر ظرفیت = 3-1 = 2
fmt.Println(len(y), cap(y)) // 2, 2
حالا y ظرفیت محدودتری دارد.
اگر append از این ظرفیت فراتر بره حتماً یک آرایه مستقل ایجاد میشه. ولی باز هم اگه قبل مستقل شدنش تغییری روی subslice بدید روی slice هم میشینه. ولی اگه len به cap برسه با خیال راحت میتونید دیگه تغییرات بدید. چون دیگه تحت سلطه x نیست🤣.
x := []int{1, 2, 3, 4, 5}
y1 := x[:2] // len=2, cap=5
y2 := x[:2:2] // len=2, cap=2
y1 = append(y1, 6) // هنوز به آرایه اصلی x وصل است، x تغییر میکند
y2 = append(y2, 6) // از cap فراتر رفت → y2 مستقل شد، x تغییری نمیکند
💡 نکته: به طور خلاصه استفاده از third index یه راه ساده برای جلوگیری از تغییر ناخواسته والد هنگام append هست.
برای اینکه مطمئن از این رفتار بشید، این دو کد رو به دقت بررسی کنید.
https://go.dev/play/p/E5kILltOzrb
https://go.dev/play/p/UaIsqsxQkku
توی لینک دوم از third index برای جلوگیری از تغییر ناخواسته استفاده میکنیم.
منبع: کتاب Learning Go
#go #third_index
☕️ Telegram | Website | Discord
❤🔥4⚡1😍1