Structs مجهولة
جزء من قسم Object Oriented Programming في رحلة 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تُعد الهياكل المجهولة (Anonymous structs) شائعة أيضًا في الاختبارات المعتمدة على الجداول (table-driven tests) حيث تمتلك كل حالة اختبار حقولاً فريدة.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}بما أن الـ structs المجهولة (anonymous structs) ليس لها اسم نوع، فلا يمكنك تعريف methods عليها أو إعادة استخدام النوع في مكان آخر. استخدمها لتجميع البيانات المؤقت والمحلي. لأي شيء ستشير إليه عدة مرات، قم بتعريف نوع struct مسمى بدلاً من ذلك.
التحدي
سهللنقم ببناء نظام تهيئة سريع يوضح متى تتألق الهياكل المجهولة (anonymous structs) — لتجميع البيانات لمرة واحدة دون الحاجة إلى نوع قابل لإعادة الاستخدام.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
config.go: قم بإنشاء دالة تسمىGetServerConfigتأخذ اسم الخادم (string)، والمنفذ (int)، ووضع التصحيح (bool) كمعلمات. يجب أن تعيد هذه الدالة هيكلاً مجهولاً (anonymous struct) يحتوي على هذه القيم الثلاث كحقول:NameوPortوDebug. نظرًا لأن هذه التهيئة تُستخدم في مكان واحد فقط، فلا داعي لتعريف نوع مسمى لها.main.go: اقرأ قيم تهيئة الخادم من المدخلات، واستدعِ دالةGetServerConfigالخاصة بك، واعرض تفاصيل التهيئة.
سيتم توفير المدخلات التالية:
- السطر 1: اسم الخادم
- السطر 2: رقم المنفذ
- السطر 3: وضع التصحيح (
trueأوfalse)
تنسيق المخرجات:
Server: [Name]
Port: [Port]
Debug: [Debug]على سبيل المثال، إذا كانت المدخلات api-server و 8080 و true، يجب أن تكون مخرجاتك:
Server: api-server
Port: 8080
Debug: trueلاحظ كيف يسمح لك الهيكل المجهول (anonymous struct) بإرجاع بيانات مجمعة دون إرباك قاعدة الكود الخاصة بك بنوع يُستخدم مرة واحدة فقط.
ورقة مرجعية
الـ هيكل المجهول (anonymous struct) هو هيكل بدون نوع مسمى، يتم تعريفه وإنشاؤه في خطوة واحدة دون استخدام الكلمة المفتاحية type:
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}تعتبر الهياكل المجهولة مفيدة لهياكل البيانات التي تُستخدم لمرة واحدة ولن يتم إعادة استخدامها في مكان آخر في الكود الخاص بك.
تشمل حالات الاستخدام الشائعة تجميع البيانات ذات الصلة لوظيفة واحدة:
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostوالاختبارات القائمة على الجداول (table-driven tests):
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}لا يمكن أن تحتوي الهياكل المجهولة على دوال (methods) معرفة عليها أو يتم إعادة استخدامها كنوع. استخدمها لتجميع البيانات المؤقت والمحلي. بالنسبة للأنواع التي يتم الرجوع إليها عدة مرات، قم بتعريف هيكل مسمى (named struct) بدلاً من ذلك.
يمكن للدوال أن تعيد هياكل مجهولة:
func GetConfig() struct {
Name string
Port int
} {
return struct {
Name string
Port int
}{
Name: "server",
Port: 8080,
}
}جرّب بنفسك
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 مع قيم المدخلات
// وتخزين الـ anonymous struct المرتجع
// TODO: طباعة التكوين (configuration) بالتنسيق المطلوب:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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