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

واجهة fmt.Stringer

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 75 من 107.

تتحكم واجهة fmt.Stringer في كيفية ظهور أنواعك عند طباعتها. وهي إحدى الواجهات الأكثر شيوعًا التي يتم تنفيذها في Go، وقد عُرِّفت في الحزمة fmt:

type Stringer interface {
    String() string
}

عند تمرير قيمة إلى fmt.Println أو fmt.Printf مع %v أو إلى دوال مماثلة، يتحقق Go مما إذا كان النوع يطبّق Stringer. وإذا كان الأمر كذلك، يستدعي Go الطريقة String() للحصول على التمثيل النصي.

type Temperature struct {
    Celsius float64
}

func (t Temperature) String() string {
    return fmt.Sprintf("%.1f°C", t.Celsius)
}

func main() {
    temp := Temperature{Celsius: 23.5}
    fmt.Println(temp)  // 23.5°C
}

من دون طريقة String()، ستعرض الطباعة التنسيق الافتراضي للبنية: {23.5}. ومن خلال تنفيذ Stringer، تتحكم تمامًا في كيفية عرض نوعك لنفسه.

هذا مفيد بشكل خاص للأنواع التي لا تنقل فيها قيم الحقول الخام المعنى بوضوح. قد يعرض نوع Duration القيمة بالشكل "2h 30m" بدلاً من إظهار النانوثواني الخام، أو قد يعرض نوع User اسماً منسقاً بدلاً من جميع حقوله.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لتتبّع الوقت يعرض المدد بتنسيق مفهوم للبشر! ستطبّق واجهة fmt.Stringer للتحكم في كيفية ظهور الأنواع المخصّصة عند طباعتها.

ستنظّم التعليمات البرمجية في ملفين:

  • duration.go: عرّف الأنواع المرتبطة بالوقت مع تمثيلات نصية مخصّصة.

    أنشئ بنية Duration تخزّن عددًا إجماليًا من الدقائق كعدد صحيح. طبّق الطريقة String() بحيث تعرض، عند طباعتها، تنسيقًا مقروءًا مثل 2h 30m لمدة قدرها 150 دقيقة، أو 0h 45m لمدة قدرها 45 دقيقة. يجب عرض الساعات والدقائق دائمًا.

    أنشئ بنية Task بحقلين هما Name (من النوع string) وTime (من النوع Duration). طبّق String() على Task لعرضه بالتنسيق [Name]: [duration]، حيث تستخدم المدة طريقة String الخاصة بها.

  • main.go: أنشئ المهام واعرضها مع مددها.

    اقرأ عدد المهام، ثم اقرأ اسم كل مهمة ومدتها بالدقائق. أنشئ مثيلات من Task واطبع كل واحدة منها مباشرةً باستخدام fmt.Println: ستتولى واجهة Stringer تنسيقها تلقائيًا.

    بعد طباعة جميع المهام، احسب الوقت الإجمالي لجميع المهام واطبعه بالتنسيق التالي:

    Total: [duration]

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

  • السطر 1: عدد المهام
  • الأسطر التالية: اسم المهمة والدقائق (سطران لكل مهمة)

على سبيل المثال، عند تقديم:

3
Code Review
90
Meeting
45
Documentation
120

يجب أن يكون الناتج:

Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15m

وعند تقديم:

2
Design
180
Testing
65

يجب أن يكون الناتج:

Design: 3h 0m
Testing: 1h 5m
Total: 4h 5m

من خلال تطبيق Stringer، تتكامل أنواعك بسلاسة مع دوال الطباعة في Go. وبدلًا من رؤية حقول البنية الخام مثل {90}، ستحصل على ناتج ذي معنى ومفهوم للمستخدمين.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// اقرأ عدد المهام
	line, _ := reader.ReadString('\n')
	numTasks, _ := strconv.Atoi(strings.TrimSpace(line))

	// TODO: أنشئ slice لتخزين المهام
	// TODO: تتبع إجمالي الدقائق

	for i := 0; i < numTasks; i++ {
		// اقرأ اسم المهمة
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)

		// اقرأ مدة المهمة بالدقائق
		minutesLine, _ := reader.ReadString('\n')
		minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))

		// TODO: أنشئ Task بالـ name و Duration
		// TODO: اطبع المهمة (fmt.Println سيستخدم واجهة Stringer)
		// TODO: أضف الدقائق إلى الإجمالي
		_ = name
		_ = minutes
	}

	// TODO: اطبع المدة الإجمالية بالتنسيق "Total: Xh Ym"
}
quiz iconاختبر نفسك

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

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

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