Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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},
}

نظرًا لأن البُنى المجهولة لا تحمل اسم نوع، فلا يمكنك تعريف أساليب لها أو إعادة استخدام النوع في موضع آخر. استخدمها لتجميع البيانات المؤقت والمحلي. أما لأي شيء ستشير إليه عدة مرات، فعرّف نوع بنية مُسمّى بدلًا من ذلك.

challenge icon

التحدي

سهل

لنبنِ نظام 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]
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت