Structs مجهولة
جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 15 من 107.
البنية anonymous struct هي بنية بدون نوع مُسمّى. تحدد بنيتها وتنشئ مثيلًا منها في خطوة واحدة، من دون استخدام الكلمة المفتاحية type.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}يُنشئ هذا قيمة struct مباشرةً من دون التصريح عن نوع قابل لإعادة الاستخدام. تكون anonymous structs مفيدة عندما تحتاج إلى بنية بيانات سريعة ومخصصة لمرة واحدة، ولن تُستخدم في مواضع أخرى من التعليمات البرمجية.
من حالات الاستخدام الشائعة تجميع البيانات ذات الصلة لدالة أو اختبار واحد.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostتُعَدّ البُنى المجهولة شائعةً أيضًا في الاختبارات المُدارة بالجداول، حيث تحتوي كل حالة اختبار على حقول فريدة.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}نظرًا لأن البُنى المجهولة لا تحمل اسم نوع، فلا يمكنك تعريف أساليب لها أو إعادة استخدام النوع في موضع آخر. استخدمها لتجميع البيانات المؤقت والمحلي. أما لأي شيء ستشير إليه عدة مرات، فعرّف نوع بنية مُسمّى بدلًا من ذلك.
التحدي
سهللنبنِ نظام configuration سريعًا يوضّح متى تتألق anonymous structs، وذلك لتجميع البيانات لمرة واحدة عندما لا تكون هناك حاجة إلى نوع قابل لإعادة الاستخدام.
ستنظّم شيفرتك عبر ملفين:
config.go: أنشئ دالة باسمGetServerConfigتأخذ اسم server (string) والمنفذ (int) ووضع debug (bool) كـ parameters. يجب أن تُرجع هذه الدالة anonymous struct يحتوي على هذه القيم الثلاث كـ fields:NameوPortوDebug. وبما أن هذا configuration يُستخدم في موضع واحد فقط، فلا حاجة إلى تعريف نوع مُسمّى له.main.go: اقرأ قيم configuration الخاصة بـ server من input، واستدعِ دالتكGetServerConfig، ثم اعرض تفاصيل configuration.
سيتم توفير input التالي:
- السطر 1: اسم Server
- السطر 2: رقم المنفذ
- السطر 3: وضع Debug (
trueأوfalse)
تنسيق الإخراج:
Server: [Name]
Port: [Port]
Debug: [Debug]على سبيل المثال، عند إعطاء api-server و8080 وtrue، يجب أن يكون الإخراج كما يلي:
Server: api-server
Port: 8080
Debug: trueلاحظ كيف يتيح لك anonymous struct إرجاع بيانات مجمّعة من دون إثقال قاعدة شيفرتك بنوع لا يُستخدم إلا مرة واحدة.
جرّب بنفسك
package main
import (
"fmt"
)
func main() {
// اقرأ قيم الإدخال
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: استدعِ GetServerConfig مع قيم الإدخال
// واحفظ الهيكل المجهول المُرجَع
// TODO: اطبع الإعدادات بالتنسيق المطلوب:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP في Go
الملفات الخارجيةمساحة العمل والـ Modules في Goالـ Packages والـ Importsالأسماء المصدرة مقابل غير المصدرةمقدمة إلى الـ OOP في Goالـ Structs كـ Classesتعريف الـ Methods في الـ Structsالـ Pointer Receivers مقابل الـ Value Receiversتهيئة الـ Structدوال الـ Constructorمراجعة - آلة حاسبة بسيطة4الواجهات
مقدمة في الواجهاتالتنفيذ الضمنيالواجهة كعقدالواجهة الفارغة (any)تأكيد النوع (Type Assertion)تبديل النوع (Type Switch)تركيب الواجهاتواجهات Stringer و Errorمراجعة - حاسبة الأشكال7التغليف
الحقول المصدرة وغير المصدرةالتغليف على مستوى الحزمةدوال الـ Getter والـ Setterإخفاء المعلومات في Goملخص - سجلات الطلاب10الأنواع العامة (Go 1.18+)
مقدمة في الأنواع العامةمعاملات الأنواعقيود الأنواعالـ Structs العامةحل بديل للـ Methods العامةملخص - المجموعات العامة13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Abstract Factoryنمط Observerنمط Strategy2تعمق في الأنواع و Structs
الأنواع الأساسية والمركبةتعريفات الأنواع المخصصةStruct TagsStructs مجهولةStructs متداخلةالقيم الصفرية والافتراضيةمراجعة - دفتر العناوين5التركيب بدلاً من الوراثة
لماذا لا تدعم Go الوراثةأساسيات تضمين الـ Structترقية الـ Methodتضمين عدة Structsالتضمين مقابل التجميعحجب الـ Methods المضمنةملخص - الهيكل الهرمي للموظفين8معالجة الأخطاء و OOP
واجهة errorأنواع الأخطاء المخصصةتغليف الأخطاء (fmt.Errorf)أخطاء Sentinelerrors.Is() و errors.As()Panic و Defer و Recoverملخص - File Parser11المكتبة القياسية والبرمجة كائنية التوجه (OOP)
io.Reader و io.Writerواجهة sort.Interfaceواجهة fmt.Stringerencoding/json مع Structsواجهة http.Handlerمراجعة - نماذج REST API14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبMiddleware كنمط مزين3المؤشرات والذاكرة
أساسيات المؤشرات في Goالمؤشرات إلى الـ Structsالتمرير بالقيمة مقابل التمرير بالمرجعدالة ()newGarbage Collection في Goملخص - بناء Linked List6تعدد الأشكال في Go
تعدد الأشكال عبر InterfacesDuck Typing في Goقواعد استيفاء الـ Interfaceمجموعات متعددة الأشكالحقن التبعيةمراجعة - معالج الدفع9التزامن والبرمجة كائنية التوجه (OOP)
أساسيات الـ Goroutinesالقنوات (Channels) والاتصالالقنوات المخزنة (Buffered) مقابل غير المخزنةجملة Selectsync.Mutex و sync.RWMutexsync.WaitGroupتصميم الـ Structs الآمنة للخيوط (Thread-Safe)مراجعة - Worker Poolتدرّب بنفسك: مترجم Go عبر الإنترنت