کداکسپلور | CodeExplore
7.91K subscribers
1.96K photos
315 videos
103 files
1.74K links
با کد اکسپلور یاد بگیر، لذت ببر و بروز باش ⚡️😉

سایت کد‌اکسپلور:
CodeExplore.ir
👨🏻‍💻 ارتباط با ما :
@CodeExploreSup
گروه :
@CodeExplore_Gap
تبلیغات در کد اکسپلور :
@CodeExploreAds
Download Telegram
فهم Third Index در Subslice های Go


در 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
❤‍🔥41😍1