دروس الوحدة (1/5)
تعريف واستخدام البنية
يقوم struct بتجميع الحقول المسماة في نوع واحد. إنها طريقة الذهاب
لبناء "الأشياء" - أكثر حرفية وفورية من الطبقات، مع
لا ميراث ولا منشئات مدمجة.
تصريح
type Person struct {
Name string
Age int
}يقدم type نوعًا مسمىًا جديدًا. تتم كتابة الحقول واحدة لكل
السطر، محمي_INLINE_3. يمكن للحقول المتتالية من نفس النوع مشاركة
الإعلان: 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.
الرؤية: القاعدة الكبيرة
يتم تصدير الحقول التي تحتوي على حرف أولي كبير (مرئية من ملفات أخرى الحزم)؛ أحرف صغيرة = خاصة بالحزمة الحالية.
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يتيح لك هذا أيضًا استخدامها كـ مفاتيح خريطة.
جربه
حدد نوع الشخص باستخدام سلسلة الاسم والعمر، ثم قم بإنشاء مثيل له كـ {Name: 'Ada', Age: 36} بشكل رئيسي.
إظهار التلميح
بناء الجملة: `اكتب اسم البنية {نوع الحقل؛ ... }`.
الحل متاح بعد 3 من المحاولات
اطبع قيمة حقل الاسم p (شخص موجود).
إظهار التلميح
الوصول الميداني: `p.Field`.
الحل متاح بعد 3 من المحاولات
ما مدى رؤية حقل "سلسلة الاسم" (أحرف صغيرة) من حزمة أخرى؟
// in package other
type X struct {
name string
}خلاصة
type Name struct { ... }: نوع مسمى جديد مع الحقول المسماة.- البناء:
T{Field: value, ...}(مستحسن) أو موضعي. - القيمة صفر: كل حقل عند صفر نوعه.
&T{...}وnew(T)للمؤشر؛ عدم المرجعية الضمنية (p.Fieldعلى*T).- أحرف كبيرة = تم تصديرها؛ أحرف صغيرة = خاصة بالحزمة.
- الهياكل قابلة للمقارنة مع
==إذا كانت جميع الحقول؛ يمكن استخدامها كمفاتيح الخريطة.