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

مراجعة - دفتر العناوين

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 18 من 107.

challenge icon

التحدي

سهل

لنقم ببناء نظام دفتر جهات اتصال يجمع بين الأنواع المخصصة (custom types)، والهياكل المتداخلة (nested structs)، وعلامات الهياكل (struct tags)، والقيم الصفرية (zero values)—كل المفاهيم التي أتقنتها في هذا الفصل.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • contact.go: قم بتعريف نموذج بيانات دفتر جهات الاتصال الخاص بك بأنواع مخصصة ذات معنى وتنسيق JSON مناسب:
    • أنشئ أنواعاً مخصصة Phone و Email بناءً على string لجعل الكود الخاص بك يوثق نفسه بنفسه
    • قم بتعريف هيكل Address يحتوي على حقول Street، و City، و Country، مع علامات JSON المناسبة لكل منها
    • قم بتعريف هيكل Contact يحتوي على Name (string)، و Phone (نوع Phone الخاص بك)، و Email (نوع Email الخاص بك)، و Address (هيكل متداخل). استخدم علامات JSON حيث يجب حذف phone و email إذا كانا فارغين
  • main.go: اقرأ معلومات جهة الاتصال من المدخلات، وأنشئ مثيلاً (instance) من Contact، وقم بإخراجه كـ JSON منسق. قد تحتوي بعض جهات الاتصال على معلومات غير مكتملة—دع القيم الصفرية و omitempty تتعامل مع ذلك بسلاسة.

سيتم توفير المدخلات التالية:

  • السطر 1: اسم جهة الاتصال
  • السطر 2: رقم الهاتف (قد يكون فارغاً)
  • السطر 3: عنوان البريد الإلكتروني (قد يكون فارغاً)
  • السطر 4: عنوان الشارع
  • السطر 5: المدينة
  • السطر 6: الدولة

استخدم json.MarshalIndent مع مسافتين للإزاحة (indentation). اطبع سلسلة JSON الناتجة.

على سبيل المثال، إذا تم إعطاء جهة اتصال باسم Alice Smith، وبدون هاتف، وبريد إلكتروني alice@example.com، وشارع 123 Main St، ومدينة Boston، ودولة USA، يجب أن يبدو مخرجك كما يلي:

{
  "name": "Alice Smith",
  "email": "alice@example.com",
  "address": {
    "street": "123 Main St",
    "city": "Boston",
    "country": "USA"
  }
}

لاحظ كيف أن حقل phone لا يظهر على الإطلاق لأنه كان فارغاً—هذا هو مفعول علامة omitempty الخاصة بك!

جرّب بنفسك

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// قراءة الاسم
	scanner.Scan()
	name := scanner.Text()

	// قراءة الهاتف (قد يكون فارغاً)
	scanner.Scan()
	phone := scanner.Text()

	// قراءة البريد الإلكتروني (قد يكون فارغاً)
	scanner.Scan()
	email := scanner.Text()

	// قراءة الشارع
	scanner.Scan()
	street := scanner.Text()

	// قراءة المدينة
	scanner.Scan()
	city := scanner.Text()

	// قراءة الدولة
	scanner.Scan()
	country := scanner.Text()

	// TODO: إنشاء مثيل Contact باستخدام قيم الإدخال
	// استخدم أنواعك المخصصة Phone و Email للحقول المعنية
	// إنشاء هيكل Address المتداخل مع street و city و country

	// TODO: استخدم json.MarshalIndent لتحويل جهة الاتصال إلى JSON
	// استخدم "" كبادئة و "  " (مسافتان) كإزاحة

	// TODO: طباعة سلسلة JSON النصية
	_ = name
	_ = phone
	_ = email
	_ = street
	_ = city
	_ = country
}

جميع دروس Object Oriented Programming