שיעורי מודול (4/5)
תגי שדה ו-JSON
תגיות בשדות struct הם מחרוזות מטא נתונים, הנקראות באמצעות השתקפות
על ידי ספריות כמו encoding/json, encoding/xml, מאמתים, ORMs. הם
נכתבים בין הסמסים (מחרוזת גולמית) מיד אחרי סוג השדה.
תַחבִּיר
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}מוסכמות עיצוב: key:"value" מופרדים ברווחים (NOT
פסיקים) עבור מספר מפתחות:
type User struct {
Email string `json:"email" validate:"required,email"`
}תג json: אפשרויות
האפשרות הנפוצה ביותר היא json, בשימוש על ידי encoding/json:
| תג | אפקט |
|---|---|
json:"nome" | משנה את שם השדה ל-nome בפלט JSON |
json:"nome,omitempty" | משמיט את השדה אם הוא בערך האפס שלו |
json:"-" | אל תעשה שדה זה בסידרה/דה-סריאל |
json:",omitempty" | שומר את שם השדה Go אבל עם omitempty |
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
Password string `json:"-"`
}
u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b)) // {"nome":"Ada"}Age מושמט (ערך אפס 0 + omitempty); Password הוא
לא נכלל לחלוטין.
מרשל ואנמרשל
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal מקבל רק מצביע, מכיוון שהוא חייב לכתוב ב-
השדות של הערך.
תגים נפוצים אחרים
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."- מגרש משחקים/תיקוףform:"..."- כריכת ג'ין / אקו
ספריות קוראים אותן באמצעות השתקפות (reflect.StructTag.Get("json")):
הם רק מחרוזות עד שמישהו יפרש אותם.
נסה את זה
הוסף את התג json:"nome" לשדה Name ואת התג json:"eta" לשדה Age.
הצג רמז
תגיות הן מחרוזות גולמיות בין סימנים לאחורים מיד אחרי סוג השדה.
הפתרון זמין לאחר 3 ניסיונות
הוסף את אפשרות השמטה לשדה גיל: יש להשמיט אותה כאשר היא 0.
הצג רמז
האפשרויות באות אחרי השם, מופרדות בפסיק: json:"nome,omitempty".
הפתרון זמין לאחר 3 ניסיונות
מה זה מדפיס עם התגים json:"nome" ו-json:"eta"?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))לְסַכֵּם
- תגים הם מחרוזות גולמיות בין סימנים לאחור:
`key:"value" key2:"value2"`. json:"nome": rename.omitempty__PROTECTED_INLINE_ 28__-: exclude.- NON-exported (lowercase) fields are ignored by
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(pointer).- Same mechanism for
xml,yaml,db,validate,form, …