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

সংজ্ঞায়িত এবং একটি struct ব্যবহার

একটি struct নামকৃত ক্ষেত্রকে একটি একক প্রকারে গোষ্ঠী করে। এটা Go এর উপায় "বস্তু" নির্মাণের — ক্লাসের চেয়ে বেশি আক্ষরিক এবং তাৎক্ষণিক, সহ কোন উত্তরাধিকার এবং কোন অন্তর্নির্মিত নির্মাণকারী.

ঘোষণা

Go
type Person struct {
    Name string
    Age  int
}

type একটি নতুন নামের প্রকার প্রবর্তন করেছে। ক্ষেত্র প্রতি এক লেখা হয় লাইন, name type। একই ধরনের পরপর ক্ষেত্র শেয়ার করতে পারেন ঘোষণা: X, Y int

সৃষ্টি

Go
// 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

ক্ষেত্র অ্যাক্সেস

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

একটি পয়েন্টারে, ptr.Name সরাসরি কাজ করে: Go সম্পাদন করে অন্তর্নিহিত সম্মান। সি-তে -> লাইক নেই।

দৃশ্যমানতা: বড় হাতের নিয়ম

বড় হাতের আদ্যক্ষর সহ ক্ষেত্রগুলি রপ্তানি করা হয় (অন্য থেকে দৃশ্যমান প্যাকেজ); ছোট হাতের অক্ষর = বর্তমান প্যাকেজের ব্যক্তিগত।

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

একই নিয়ম Go-তে প্রতিটি শনাক্তকারীর ক্ষেত্রে প্রযোজ্য: প্রকার, ফাংশন, ভেরিয়েবল, ক্ষেত্র।

বেনামী এবং নেস্টেড structs

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
}

তুলনীয়তা

দুটি কাঠামো == এর সাথে তুলনাযোগ্য যদি তাদের সমস্ত ক্ষেত্র হয় তুলনীয় (ভিতরে কোন স্লাইস/মানচিত্র/ফাঙ্কস নেই):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

এটি আপনাকে সেগুলিকে মানচিত্র কী হিসাবে ব্যবহার করতে দেয়৷

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

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

Name স্ট্রিং এবং Age int দিয়ে ব্যক্তির প্রকার সংজ্ঞায়িত করুন, তারপর এটিকে {Name: 'Ada', Age: 36} হিসেবে ইনস্ট্যান্টিয়েট করুন।

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

সিনট্যাক্স: `টাইপ নাম struct { ফিল্ড টাইপ; ... }`

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

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

p (একটি বিদ্যমান ব্যক্তি) এর নাম ক্ষেত্রের মান প্রিন্ট করুন।

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

ক্ষেত্র অ্যাক্সেস: `p. Field`।

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

Quiz#go.m5.l1.e3
প্রস্তুত

অন্য প্যাকেজ থেকে একটি 'নাম স্ট্রিং' ক্ষেত্রের (ছোট হাতের) দৃশ্যমানতা কী?

Go
// in package other
type X struct {
    name string
}
উত্তরের বিকল্প

রিক্যাপ

  • type Name struct { ... }: নামযুক্ত ক্ষেত্র সহ নতুন নামকরণকৃত প্রকার।
  • নির্মাণ: T{Field: value, ...} (প্রস্তাবিত) বা অবস্থানগত।
  • শূন্য মান: প্রতিটি ক্ষেত্র তার প্রকারের শূন্য।
  • একটি পয়েন্টারের জন্য &T{...} এবং new(T); অন্তর্নিহিত ডিরেফারেন্স (p.Field এ *T)।
  • বড় হাতের = রপ্তানি করা; ছোট হাতের = প্যাকেজের ব্যক্তিগত।
  • সমস্ত ক্ষেত্র থাকলে কাঠামোগুলি == এর সাথে তুলনীয়; মানচিত্র কী হিসাবে ব্যবহারযোগ্য।