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

تعريف واستخدام البنية

يقوم struct بتجميع الحقول المسماة في نوع واحد. إنها طريقة الذهاب لبناء "الأشياء" - أكثر حرفية وفورية من الطبقات، مع لا ميراث ولا منشئات مدمجة.

تصريح

Go
type Person struct {
    Name string
    Age  int
}

يقدم type نوعًا مسمىًا جديدًا. تتم كتابة الحقول واحدة لكل السطر، محمي_INLINE_3. يمكن للحقول المتتالية من نفس النوع مشاركة الإعلان: 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.

الرؤية: القاعدة الكبيرة

يتم تصدير الحقول التي تحتوي على حرف أولي كبير (مرئية من ملفات أخرى الحزم)؛ أحرف صغيرة = خاصة بالحزمة الحالية.

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جارٍ التحميل…

حدد نوع الشخص باستخدام سلسلة الاسم والعمر، ثم قم بإنشاء مثيل له كـ {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
}
خيارات الإجابة

خلاصة

  • type Name struct { ... }: نوع مسمى جديد مع الحقول المسماة.
  • البناء: T{Field: value, ...} (مستحسن) أو موضعي.
  • القيمة صفر: كل حقل عند صفر نوعه.
  • &T{...} وnew(T) للمؤشر؛ عدم المرجعية الضمنية (p.Field على *T).
  • أحرف كبيرة = تم تصديرها؛ أحرف صغيرة = خاصة بالحزمة.
  • الهياكل قابلة للمقارنة مع == إذا كانت جميع الحقول؛ يمكن استخدامها كمفاتيح الخريطة.