دروس الوحدة (4/5)
العلامات الميدانية وJSON
العلامات الموجودة في حقول البنية هي سلاسل بيانات وصفية، تُقرأ من خلال الانعكاس
بواسطة مكتبات مثل encoding/json، encoding/xml، أدوات التحقق من الصحة، ORMs. هم
تتم كتابتها بين backticks (سلسلة أولية) مباشرة بعد نوع الحقل.
بناء الجملة
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:
| العلامة | تأثير |
|---|---|
| محمي_INLINE_6 | يعيد تسمية الحقل إلى nome في إخراج JSON |
| محمي_INLINE_8 | يحذف الحقل إذا كان عند قيمته صفر |
| محمي_INLINE_9 | لا تقم بإجراء تسلسل/إلغاء تسلسل هذا الحقل |
| محمي_INLINE_10 | يحتفظ باسم حقل 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)؛ محمي_INLINE_15 هو
مستبعدة تماما.
المارشال وأونمارشال
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal يقبل المؤشر فقط، لأنه يجب أن يُكتب في ملف
حقول القيمة.
العلامات الشائعة الأخرى
- محمي_INLINE_17 — محمي_INLINE_18
- محمي_INLINE_19 — yaml.v3
db:"..."— sqlx / pgxvalidate:"..."— اذهب إلى الملعب/المدققform:"..."— ربط الجين / الصدى
تقرأها المكتبات من خلال التأمل (reflect.StructTag.Get("json")):
إنها مجرد سلاسل حتى يفسرها شخص ما.
جربه
أضف علامة json:"nome" إلى حقل الاسم وعلامة json:"eta" إلى حقل العمر.
إظهار التلميح
العلامات عبارة عن سلاسل أولية بين العلامات الخلفية مباشرة بعد نوع الحقل.
الحل متاح بعد 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,التحقق,form، ...