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

Garbage Collection في Go

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

على عكس لغات مثل C أو C++، تتولى Go إدارة الذاكرة تلقائيًا من خلال جمع القمامة (GC). لا تحتاج إلى تحرير الذاكرة يدويًا عند الانتهاء من استخدامها. يتتبّع وقت تشغيل Go الذاكرة التي لا تزال قيد الاستخدام ويستعيد ما تبقّى.

عندما تخصص الذاكرة باستخدام new() أو make() أو من خلال إنشاء متغيرات، يراقب جامع البيانات المهملة في Go عمليات التخصيص هذه. وبمجرد أن تصبح قيمة ما غير قابلة للوصول من أي جزء في برنامجك، يحرر GC تلك الذاكرة automatically.

func createPerson() *Person {
    p := &Person{Name: "Alice", Age: 30}
    return p  // p يهرب إلى الـ heap، وGC سيديره
}

func main() {
    person := createPerson()
    fmt.Println(person.Name)
    // عندما لا يعود person مستخدماً، يستعيد GC الذاكرة
}

في هذا المثال، يتم تخصيص البنية Person على الكومة لأنها تُعاد من الدالة. يُجري مُصرّف Go تحليل الهروب لتحديد ما إذا كان يمكن لمتغير أن يبقى على المكدس أو يجب نقله إلى الكومة. لا يدير جامع البيانات المهملة سوى ذاكرة الكومة.

تعني إدارة memory التلقائية هذه أنه يمكنك التركيز على بناء تطبيقك دون القلق بشأن تسرّبات memory الناتجة عن عمليات إلغاء التخصيص المنسية. ومع ذلك، يساعدك فهم وجود GC على كتابة تعليمات برمجية أكثر كفاءة من خلال تقليل عمليات التخصيص غير الضرورية عندما يكون الأداء مهماً.

challenge icon

التحدي

سهل

لنَبْنِ مدير جلسات يوضّح كيفية تعامل جامع البيانات المهملة في Go مع الذاكرة الخاصة بالكائنات التي تهرب إلى الكومة. ستنشئ جلسات تُخصَّص ديناميكيًا وتُعاد من الدوال، مما يتيح لـ GC إدارة دورة حياتها.

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

  • session.go: عرّف بنية Session مع حقول ID (من النوع string)، وUsername (من النوع string)، وData (وهي شريحة من السلاسل النصية). أنشئ دالة NewSession تتلقى معرّفًا واسم مستخدم، وتخصّص Session جديدة على الكومة (من خلال إرجاع مؤشر)، وتهيّئ شريحة Data على أنها فارغة. أضف أيضًا method باسم AddData مع مستقبل مؤشر، تُلحق سلسلة نصية بشريحة Data الخاصة بالجلسة، وmethod باسم Summary تُرجع سلسلة نصية منسّقة تعرض details الجلسة.
  • main.go: اقرأ معلومات الجلسة من الإدخال، وأنشئ جلسة باستخدام دالة المنشئ، وأضف إليها بعض entries من البيانات، ثم اعرض ملخص الجلسة. وبما أن الجلسة أُنشئت داخل دالة وأُعيدت كمؤشر، فإنها تهرب إلى الكومة حيث سيديرها جامع البيانات المهملة.

ستُزوَّد بالمدخلات التالية:

  • السطر 1: معرّف الجلسة
  • السطر 2: اسم المستخدم
  • السطر 3: أول entry من البيانات لإضافته
  • السطر 4: ثاني entry من البيانات لإضافته

يجب أن تُرجع method Summary سلسلة نصية بهذا التنسيق:

Session [ID] for user [Username]
Data entries: [count]
- [entry1]
- [entry2]

على سبيل المثال، عند إعطاء sess-001 وalice وlogin وview_dashboard، يجب أن يكون ناتجك:

Session sess-001 for user alice
Data entries: 2
- login
- view_dashboard

الفكرة الأساسية هنا هي أن دالة NewSession تنشئ Session وتُرجع مؤشرًا إليها. وهذا يتسبب في "escape" الـ Session إلى الكومة بدلًا من بقائها على المكدس، مما يجعلها مؤهلة لجمع البيانات المهملة بمجرد عدم بقاء أي مراجع إليها. لا يحتاج كودك إلى تحرير هذه الذاكرة يدويًا: إذ تتولى Go ذلك تلقائيًا.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
)

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

	// اقرأ معرّف الجلسة
	sessionID, _ := reader.ReadString('\n')
	sessionID = sessionID[:len(sessionID)-1]

	// اقرأ اسم المستخدم
	username, _ := reader.ReadString('\n')
	username = username[:len(username)-1]

	// اقرأ إدخال البيانات الأول
	data1, _ := reader.ReadString('\n')
	data1 = data1[:len(data1)-1]

	// اقرأ إدخال البيانات الثاني
	data2, _ := reader.ReadString('\n')
	data2 = data2[:len(data2)-1]

	// TODO: أنشئ جلسة جديدة باستخدام الدالة NewSession
	// ستهرب الجلسة إلى الكومة لأننا نعيد مؤشراً

	// TODO: أضف إدخالات البيانات إلى الجلسة باستخدام الطريقة AddData

	// TODO: اطبع ملخص الجلسة باستخدام الطريقة Summary
	fmt.Println("")
}
quiz iconاختبر نفسك

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

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

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