الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 4 من 524/50 في الدورة~12 min
دروس الوحدة (4/5)

العلامات الميدانية وJSON

العلامات الموجودة في حقول البنية هي سلاسل بيانات وصفية، تُقرأ من خلال الانعكاس بواسطة مكتبات مثل encoding/json، encoding/xml، أدوات التحقق من الصحة، ORMs. هم تتم كتابتها بين backticks (سلسلة أولية) مباشرة بعد نوع الحقل.

بناء الجملة

Go
type User struct {
    Name string `json:"nome"`
    Age  int    `json:"eta,omitempty"`
}

اصطلاح التنسيق: key:"value" مفصولة بمسافات (NOT الفواصل) لمفاتيح متعددة:

Go
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
Go
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 هو مستبعدة تماما.

المارشال وأونمارشال

Go
// 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 / pgx
  • validate:"..." — اذهب إلى الملعب/المدقق
  • form:"..." — ربط الجين / الصدى

تقرأها المكتبات من خلال التأمل (reflect.StructTag.Get("json")): إنها مجرد سلاسل حتى يفسرها شخص ما.

جربه

تمرين#go.m5.l4.e1
المحاولات: 0جارٍ التحميل…

أضف علامة json:"nome" إلى حقل الاسم وعلامة json:"eta" إلى حقل العمر.

جارٍ تحميل المحرر…
إظهار التلميح

العلامات عبارة عن سلاسل أولية بين العلامات الخلفية مباشرة بعد نوع الحقل.

الحل متاح بعد 3 من المحاولات

تمرين#go.m5.l4.e2
المحاولات: 0جارٍ التحميل…

أضف خيار الحذف الفارغ إلى حقل العمر: يجب حذفه عندما يكون 0.

جارٍ تحميل المحرر…
إظهار التلميح

تأتي الخيارات بعد الاسم، مفصولة بفاصلة: json:"nome,omitempty".

الحل متاح بعد 3 من المحاولات

Quiz#go.m5.l4.e3
جاهز

ما الذي تتم طباعته بالعلامات json:"nome" وjson:"eta"؟

Go
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، ...