דילוג לתוכן המרכזי
מודול 5 · שיעור 1 מתוך 521/50 בקורס~12 min
שיעורי מודול (1/5)

הגדרה ושימוש במבנה

struct מקבץ שדות בעלי שם לסוג יחיד. זו דרכו של גו של בניית "חפצים" - מילולי ומיידי יותר ממעמדות, עם ללא ירושה וללא בנאים מובנים.

הַצהָרָה

Go
type Person struct {
    Name string
    Age  int
}

type מציג סוג חדש בעל שם. שדות נכתבים אחד לכל קו, name type. שדות עוקבים מאותו סוג יכולים לשתף את הצהרה: X, Y int.

יְצִירָה

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

גישה לשדה

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

על מצביע, ptr.Name פועל ישירות: Go מבצע את התייחסות מרומזת. אין -> כמו ב-C.

נראות: כלל האותיות הגדולות

שדות עם אותיות גדולות מיוצאים (גלויים מאחר חבילות); אותיות קטנות = פרטי לחבילה הנוכחית.

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

אותו כלל חל על כל מזהה ב-Go: סוגים, פונקציות, משתנים, שדות.

מבנים אנונימיים ומקוננים

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

יכולת השוואה

שני מבנים ניתנים להשוואה ל-== אם כל השדות שלהם הם ניתן להשוות (ללא פרוסות/מפות/פונקציות בפנים):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

זה גם מאפשר לך להשתמש בהם בתור מפתחות מפה.

נסה את זה

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

הגדר את סוג האדם עם מחרוזת שם ו-Age int, ולאחר מכן הגדר אותו בתור {Name: 'Ada', Age: 36} ב-main.

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

תחביר: `type Name struct { Field Type; ... }`.

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

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

הדפס את הערך של השדה Name של p (אדם קיים).

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

גישה לשדה: `p.Field`.

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

Quiz#go.m5.l1.e3
מוכן

מהי החשיפה של שדה 'מחרוזת שם' (אותיות קטנות) מחבילה אחרת?

Go
// in package other
type X struct {
    name string
}
אפשרויות תשובה

לְסַכֵּם

  • type Name struct { ... }: סוג חדש בשם עם שדות בעלי שם.
  • בנייה: T{Field: value, ...} (מומלץ) או מיקום.
  • ערך אפס: כל שדה באפס הסוג שלו.
  • &T{...} וnew(T) עבור מצביע; התייחסות מרומזת (p.Field על *T).
  • אותיות רישיות = מיוצא; אותיות קטנות = פרטי לחבילה.
  • מבנים ניתנים להשוואה ל-== אם כל השדות הם; שמיש כמפתחות מפה.