مرکزی مواد پر جائیں
ماڈیول 5 · سبق 1 از 5کورس میں 21/50~12 min
ماڈیول اسباق (1/5)

ساخت کی تعریف اور استعمال

ایک struct نام والے فیلڈز کو ایک قسم میں گروپ کرتا ہے۔ یہ جانے کا راستہ ہے۔ "آبجیکٹ" بنانے کا - کلاسوں سے زیادہ لفظی اور فوری، کے ساتھ کوئی وراثت نہیں اور کوئی بلٹ ان کنسٹرکٹر نہیں ہے۔

اعلامیہ

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 انجام دیتا ہے۔ مضمون حوالہ۔ C میں کوئی -> پسند نہیں۔

مرئیت: بڑے حروف کا اصول

بڑے حروف کے ابتدائی والے فیلڈز ایکسپورٹ کیے جاتے ہیں (دوسرے سے مرئی پیکجز)؛ Lowercase = موجودہ پیکیج کے لیے نجی۔

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

یہی اصول Go میں ہر شناخت کنندہ پر لاگو ہوتا ہے: اقسام، افعال، متغیرات، فیلڈز۔

گمنام اور نیسٹڈ سٹرکٹس

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لوڈ ہو رہا ہے…

نام کے اسٹرنگ اور Age int کے ساتھ شخص کی قسم کی وضاحت کریں، پھر اسے بنیادی طور پر {Name: 'Ada'، Age: 36} کے طور پر انسٹینٹیٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

نحو: `ٹائپ نام کی ساخت { فیلڈ کی قسم; ... }`

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m5.l1.e2
کوششیں: 0لوڈ ہو رہا ہے…

p (موجودہ شخص) کے نام فیلڈ کی قدر پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

فیلڈ تک رسائی: `p.Field`۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m5.l1.e3
تیار

کسی دوسرے پیکیج سے 'نام سٹرنگ' فیلڈ (لوئر کیس) کی مرئیت کیا ہے؟

Go
// in package other
type X struct {
    name string
}
جواب کے اختیارات

Recap

  • type Name struct { ... }: نئی نام کی قسم نامزد فیلڈز کے ساتھ۔
  • تعمیر: T{Field: value, ...} (تجویز کردہ) یا پوزیشنل۔
  • صفر کی قدر: ہر فیلڈ اپنی قسم کے صفر پر۔
  • ایک پوائنٹر کے لیے &T{...} اور new(T)؛ ضمنی حوالہ (p.Field پر *T)۔
  • بڑے = برآمد شدہ؛ lowcase = پیکیج میں نجی۔
  • سٹرکٹس کا موازنہ == کے ساتھ کیا جاسکتا ہے اگر تمام فیلڈز ہیں؛ نقشہ کی چابیاں کے طور پر قابل استعمال۔