💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ محمد حیدری
دلیل کم شدن len اسلایس پس از شیفت دادن ایندکس‌های 8 به بعد به سمت چپ
جامعه گولنگ ایجاد شده در ۱۰ خرداد ۱۴۰۲

سلام

در دقیقه 22:30 دلیل اینکه پس از شیفت دادن ایندکس‌های 8 به بعد اسلایس به سمت چپ یدونه از len اسلایس کم شد این هست که عنصر آخر nil میشه یا دلیل دیگه ای داره؟

آیا cap هم تغییری میکنه یا همچنان 15 باقی میمونه؟

سلام

این نحوه تغییر cap و len هستش

numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} // len: 15 cap: 15
numbers = append(numbers, 0) // len: 16 cap: 30
_ = copy(numbers[8:], numbers[7:]) // no change len: 16 cap: 30
numbers[7] = 75 // no change len: 16 cap: 30
numbers = append(numbers[:7], numbers[8:]...) // len: 15 cap: 30

cap تغییری نمیکنه

اما len تعداد اعضای جدید numbers خواهد بود، در واقع len بخاطر شیفت کم نمیشه بلکه بر اساس append خط آخر len مشخص میشه

مثلا اگه بجای خط آخر این کد را استفاده کنی len برابر با 11 خواهد شد.

numbers = append(numbers[:3], numbers[8:10]...) // len: 5 cap: 30
حامد نعیمایی ۱۰ خرداد ۱۴۰۲، ۱۳:۴۸

ممنون از توجه و راهنمایی خوبتون

پس اگه اشتباه نکنم در مثال آخری که توی جوابتون زدید اسلایس numbers میشه:

{1, 2, 3, 9, 10}

عملکرد پشت صحنه تابع append چجوریه؟

یدونه اسلایس از آرگومان اولش میسازه، یدونه اسلایس هم از آرگومان دومش میسازه، بعدش دومی رو از سمت راست به اولی combine میکنه؟ یا به صورت دیگه ای هستش؟

محمد حیدری ۱۱ خرداد ۱۴۰۲، ۱۹:۵۹

سلام وقتتون بخیر


هنگامی که شما از تابع append در گولنگ استفاده می‌کنید، این تابع ابتدا یک slice جدید با طولی برابر با slice اصلی شما و با ظرفیت بیشتر از آن ایجاد می‌کند. سپس تمام عناصر موجود در slice اصلی را به slice جدید منتقل می‌کند و المان جدید را در پایان slice جدید قرار می‌دهد. در نهایت، تابع append slice جدید را به عنوان خروجی باز می‌گرداند.

به عنوان مثال، فرض کنید شما یک slice به نام mySlice دارید و می‌خواهید المان جدیدی به آن اضافه کنید

mySlice := []int{1, 2, 3}
newSlice := append(mySlice, 4)


در اینجا، ابتدا mySlice شامل اعداد 1، 2 و 3 است. با استفاده از تابع append، عدد 4 به پایان mySlice اضافه می‌شود و slice جدید در متغیر newSlice ذخیره می‌شود. حالا newSlice شامل اعداد 1، 2، 3 و 4 است.


پوریا شفیعی ۱۴ خرداد ۱۴۰۲، ۱۶:۳۶