ماڈیول اسباق (1/5)
ساخت کی تعریف اور استعمال
ایک struct نام والے فیلڈز کو ایک قسم میں گروپ کرتا ہے۔ یہ جانے کا راستہ ہے۔
"آبجیکٹ" بنانے کا - کلاسوں سے زیادہ لفظی اور فوری، کے ساتھ
کوئی وراثت نہیں اور کوئی بلٹ ان کنسٹرکٹر نہیں ہے۔
اعلامیہ
type Person struct {
Name string
Age int
}type نے ایک نئی نام کی قسم متعارف کرائی ہے۔ کھیتوں کو فی ایک لکھا جاتا ہے۔
لائن، name type۔ ایک ہی قسم کے لگاتار فیلڈز شیئر کر سکتے ہیں۔
اعلان: X, Y int.
تخلیق
// 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فیلڈ تک رسائی
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 = موجودہ پیکیج کے لیے نجی۔
type User struct {
Name string // exported
salt []byte // private to the package
}یہی اصول 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
}موازنہ
دو ڈھانچے == کے ساتھ موازنہ ہیں اگر ان کے تمام فیلڈز ہیں
موازنہ (اندر کوئی سلائسس/نقشے/فنکس نہیں):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueیہ آپ کو انہیں نقشہ کیز کے بطور بھی استعمال کرنے دیتا ہے۔
اسے آزمائیں
نام کے اسٹرنگ اور Age int کے ساتھ شخص کی قسم کی وضاحت کریں، پھر اسے بنیادی طور پر {Name: 'Ada'، Age: 36} کے طور پر انسٹینٹیٹ کریں۔
اشارہ دکھائیں۔
نحو: `ٹائپ نام کی ساخت { فیلڈ کی قسم; ... }`
3 کوششوں کے بعد حل دستیاب ہے۔
p (موجودہ شخص) کے نام فیلڈ کی قدر پرنٹ کریں۔
اشارہ دکھائیں۔
فیلڈ تک رسائی: `p.Field`۔
3 کوششوں کے بعد حل دستیاب ہے۔
کسی دوسرے پیکیج سے 'نام سٹرنگ' فیلڈ (لوئر کیس) کی مرئیت کیا ہے؟
// in package other
type X struct {
name string
}Recap
type Name struct { ... }: نئی نام کی قسم نامزد فیلڈز کے ساتھ۔- تعمیر:
T{Field: value, ...}(تجویز کردہ) یا پوزیشنل۔ - صفر کی قدر: ہر فیلڈ اپنی قسم کے صفر پر۔
- ایک پوائنٹر کے لیے
&T{...}اورnew(T)؛ ضمنی حوالہ (p.Fieldپر*T)۔ - بڑے = برآمد شدہ؛ lowcase = پیکیج میں نجی۔
- سٹرکٹس کا موازنہ
==کے ساتھ کیا جاسکتا ہے اگر تمام فیلڈز ہیں؛ نقشہ کی چابیاں کے طور پر قابل استعمال۔