CODEEXPLORE Telegram 4178
فهم 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



tgoop.com/CodeExplore/4178
Create:
Last Update:

فهم 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

BY کداکسپلور | CodeExplore


Share with your friend now:
tgoop.com/CodeExplore/4178

View MORE
Open in Telegram


Telegram News

Date: |

How to Create a Private or Public Channel on Telegram? In 2018, Telegram’s audience reached 200 million people, with 500,000 new users joining the messenger every day. It was launched for iOS on 14 August 2013 and Android on 20 October 2013. To view your bio, click the Menu icon and select “View channel info.” Over 33,000 people sent out over 1,000 doxxing messages in the group. Although the administrators tried to delete all of the messages, the posting speed was far too much for them to keep up. With the administration mulling over limiting access to doxxing groups, a prominent Telegram doxxing group apparently went on a "revenge spree."
from us


Telegram کداکسپلور | CodeExplore
FROM American