שיעורי מודול (1/5)
הגדרה ושימוש במבנה
struct מקבץ שדות בעלי שם לסוג יחיד. זו דרכו של גו
של בניית "חפצים" - מילולי ומיידי יותר ממעמדות, עם
ללא ירושה וללא בנאים מובנים.
הַצהָרָה
type Person struct {
Name string
Age int
}type מציג סוג חדש בעל שם. שדות נכתבים אחד לכל
קו, name type. שדות עוקבים מאותו סוג יכולים לשתף את
הצהרה: X, Y int.
יְצִירָה
// 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גישה לשדה
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.
נראות: כלל האותיות הגדולות
שדות עם אותיות גדולות מיוצאים (גלויים מאחר חבילות); אותיות קטנות = פרטי לחבילה הנוכחית.
type User struct {
Name string // exported
salt []byte // private to the package
}אותו כלל חל על כל מזהה ב-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
}יכולת השוואה
שני מבנים ניתנים להשוואה ל-== אם כל השדות שלהם הם
ניתן להשוות (ללא פרוסות/מפות/פונקציות בפנים):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueזה גם מאפשר לך להשתמש בהם בתור מפתחות מפה.
נסה את זה
הגדר את סוג האדם עם מחרוזת שם ו-Age int, ולאחר מכן הגדר אותו בתור {Name: 'Ada', Age: 36} ב-main.
הצג רמז
תחביר: `type Name struct { Field Type; ... }`.
הפתרון זמין לאחר 3 ניסיונות
הדפס את הערך של השדה Name של p (אדם קיים).
הצג רמז
גישה לשדה: `p.Field`.
הפתרון זמין לאחר 3 ניסיונות
מהי החשיפה של שדה 'מחרוזת שם' (אותיות קטנות) מחבילה אחרת?
// in package other
type X struct {
name string
}לְסַכֵּם
type Name struct { ... }: סוג חדש בשם עם שדות בעלי שם.- בנייה:
T{Field: value, ...}(מומלץ) או מיקום. - ערך אפס: כל שדה באפס הסוג שלו.
&T{...}וnew(T)עבור מצביע; התייחסות מרומזת (p.Fieldעל*T).- אותיות רישיות = מיוצא; אותיות קטנות = פרטי לחבילה.
- מבנים ניתנים להשוואה ל-
==אם כל השדות הם; שמיש כמפתחות מפה.