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: |

Choose quality over quantity. Remember that one high-quality post is better than five short publications of questionable value. Add the logo from your device. Adjust the visible area of your image. Congratulations! Now your Telegram channel has a face Click “Save”.! Developing social channels based on exchanging a single message isn’t exactly new, of course. Back in 2014, the “Yo” app was launched with the sole purpose of enabling users to send each other the greeting “Yo.” Done! Now you’re the proud owner of a Telegram channel. The next step is to set up and customize your channel. The Standard Channel
from us


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