דילוג לתוכן המרכזי
מודול 4 · שיעור 2 מתוך 517/50 בקורס~15 min
שיעורי מודול (2/5)

פרוסות: המבנה האידיומטי

פרוסה היא מבנה הנתונים הנפוצים ביותר ב-Go: תצוגה דינמית מעל מערך בסיס. תחביר: []T. בניגוד למערכים, האורך הוא לא חלק מהסוג, ואתה יכול לגדל אותו עם append.

אנטומיה של פרוסה

בפנים פרוסה היא מבנה של שלושה שדות:

  • מצביע לרכיב הראשון במערך הבסיסי
  • אורך (len): מספר אלמנטים גלויים
  • קיבולת (cap): אלמנטים זמינים מתחילת התצוגה עד סוף המערך הבסיסי
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

יְצִירָה

Go
a := []int{1, 2, 3}          // literal
b := make([]int, 3)          // [0 0 0]   len=3 cap=3
c := make([]int, 3, 10)      // len=3 cap=10 (reserved)
var d []int                  // nil slice: len=0 cap=0, still usable with append

append: תמיד הקצה את התוצאה

append מוסיף אלמנטים ומחזיר פרוסה חדשה (אפשרי הקצאת מערך חדש אם הקיבולת אינה מספקת):

Go
s := []int{1, 2, 3}
s = append(s, 4)              // [1 2 3 4]
s = append(s, 5, 6, 7)        // append multiple elements
s = append(s, altra...)       // concatenate another slice (spread)

ביטוי פרוסה s[a:b]

מחלץ תת-פרוסה מ-a (כולל) עד ​​b (בלעדי):

Go
s := []int{10, 20, 30, 40, 50}
sub := s[1:4]              // [20 30 40]
inizio := s[:2]            // [10 20]
fine := s[3:]              // [40 50]
intera := s[:]             // [10 20 30 40 50]

תת פרוסות שתף את המערך הבסיסי עם הפרוסה המקורית: מוטציות דרך sub[i] = ... גלויות גם ב-s.

pitfall: שיתוף מערכים

Go
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s)             // [99 2 3 4] — modified!

כדי לקבל עותק עצמאי, השתמש ב-copy או append:

Go
out := make([]int, len(sub))
copy(out, sub)

נסה את זה

פעילות גופנית#go.m4.l2.e1
ניסיונות: 0טוען...

צור פרוסה s עם [1, 2, 3] והשתמש ב-append כדי להוסיף 4.

טוען עורך...
הצג רמז

הקצה תמיד את התוצאה של הוספה בחזרה ל-'s'.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m4.l2.e2
ניסיונות: 0טוען...

השתמש בביטוי פרוסה כדי לחלץ אלמנטים ממדד 1 כולל עד 3 בלעדי (כלומר [20, 30]).

טוען עורך...
הצג רמז

תחביר: `s[start:end]`, `start` כולל, `end` בלעדי.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m4.l2.e3
מוכן

מה מאלה לא נכון לכתוב?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
אפשרויות תשובה

לְסַכֵּם

  • []T: תצוגה דינמית על מערך; משולש (ptr, len, cap).
  • make([]T, len, cap) להקצאה מראש; var s []T לפרוסה אפסית שמישה.
  • s = append(s, ...): הקצה תמיד את התוצאה.
  • s[a:b] חולק את המערך הבסיסי: copy(...) עבור עותקים עצמאיים.
  • פרוסה nil = בסדר לקריאה/טווח/הוספה; שונה לגמרי ממפה אפסית.