মূল কন্টেন্টে যান
মডিউল 5 · 4-এর পাঠ 5কোর্সে 24/50~12 min
মডিউল পাঠ (4/5)

ফিল্ড ট্যাগ এবং JSON

স্ট্রাকট ফিল্ডে ট্যাগ হল মেটাডেটা স্ট্রিং, প্রতিফলনের মাধ্যমে পড়া লাইব্রেরি দ্বারা যেমন encoding/json, encoding/xml, ভ্যালিডেটর, ORM তারা ফিল্ডের টাইপের ঠিক পরে ব্যাকটিক্স (কাঁচা স্ট্রিং) এর মধ্যে লেখা হয়।

সিনট্যাক্স

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

ফর্ম্যাট কনভেনশন: key:"value" স্পেস দ্বারা বিভক্ত (না কমা) একাধিক কীগুলির জন্য:

Go
type User struct {
    Email string `json:"email" validate:"required,email"`
}

json ট্যাগ: বিকল্প

সবচেয়ে সাধারণ বিকল্প হল json, encoding/json দ্বারা ব্যবহৃত:

| ট্যাগ | প্রভাব | | ----------------------- | ------------------------------------------------- | ----- | | json:"nome" | JSON আউটপুটে ক্ষেত্রটির নাম পরিবর্তন করে nome এ | | json:"nome,omitempty" | ক্ষেত্রটি বাদ দেয় যদি এটির শূন্য মান হয় | | json:"-" | এই ক্ষেত্রটিকে সিরিয়ালাইজ/ডিসিরিয়ালাইজ করবেন না | | json:",omitempty" | 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); Password হল৷ সম্পূর্ণরূপে বাদ।

মার্শাল এবং আনমার্শাল

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal শুধুমাত্র একটি পয়েন্টার গ্রহণ করে, কারণ এটি অবশ্যই লিখতে হবে৷ মান এর ক্ষেত্র।

অন্যান্য সাধারণ ট্যাগ

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — go-playground/validator
  • form:"..." — জিন/ইকো বাইন্ডিং

লাইব্রেরিগুলি প্রতিফলনের মাধ্যমে পড়ে (reflect.StructTag.Get("json")): কেউ তাদের ব্যাখ্যা না করা পর্যন্ত তারা কেবল স্ট্রিং।

চেষ্টা করে দেখুন

ব্যায়াম#go.m5.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

Name ফিল্ডে json:"nome" ট্যাগ এবং Age ফিল্ডে json:"eta" ট্যাগ যোগ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ট্যাগ হল ফিল্ড টাইপের ঠিক পরে ব্যাকটিক্সের মধ্যে কাঁচা স্ট্রিং।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m5.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

বয়স ক্ষেত্রে omitempty বিকল্পটি যোগ করুন: এটি 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: omit if zero value. -: exclude.
  • NON-exported (lowercase) fields are ignored by encoding/json.
  • json.Marshal(v) ↔ json.Unmarshal(ডেটা, &v) (pointer).
  • Same mechanism for xml, yaml, db, validate, form, …