كيف تجتاز مقابلة Go: أهم الأسئلة من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تجتاز مقابلة Go: أهم الأسئلة من الألف إلى الياء

\n\n

مقابلة منصب مطور Go ليست مجرد اختبار للقواعد النحوية. يبحث أصحاب العمل عن مرشحين يفهمون فلسفة اللغة: البساطة، والتزامن، وإدارة الذاكرة الفعالة. في هذا المقال، سنستعرض الأسئلة الرئيسية التي سيُطرح عليك بالتأكيد - من الأساسيات إلى المواضيع المتقدمة مع أمثلة برمجية. استعد باستخدام قائمتنا المرجعية، وستشعر بالثقة.

\n\n

1. أساسيات Go: أنواع البيانات، الهياكل، وإدارة الذاكرة

\n\n

لنبدأ بالأساسيات. لا مفر منها. يحب المحاورون طرح أسئلة حول الأنواع وسلوكها.

\n\n

ما هي أنواع البيانات المضمنة في Go؟

\n
    \n
  • أساسية: int, float64, string, bool.
  • \n
  • مجموعة: array, struct.
  • \n
  • مرجعية: slice, map, channel, pointer, function.
  • \n
\n\n

ما الفرق بين المصفوفة (array) والشريحة (slice)؟

\n

المصفوفة لها طول ثابت يُحدد في مرحلة الترجمة. الشريحة هي هيكل ديناميكي يشير إلى مصفوفة أساسية.

\n
// مصفوفة\nvar arr [3]int = [3]int{1, 2, 3}\narr[0] = 10 // صحيح\n\n// شريحة\nslc := []int{1, 2, 3}\nslc = append(slc, 4) // يمكن أن ينمو الطول\n
\n

سؤال صعب: ماذا يحدث للذاكرة عند استخدام append إذا تم تجاوز سعة الشريحة؟ (الإجابة: Go يخصص مصفوفة جديدة أكبر بمرتين وينسخ البيانات).

\n\n

كيف تعمل الخريطة (map) في Go؟

\n

الخريطة هي جدول تجزئة. ترتيب الاجتياز غير مضمون. عند القراءة من مفتاح غير موجود، يتم إرجاع القيمة الصفرية (مثل 0 لـ int).

\n
m := make(map[string]int)\nm["key"] = 42\nvalue, ok := m["key"] // ok == true إذا كان المفتاح موجودًا\n
\n\n

2. التزامن: الغوروتينات، القنوات، والميوتكسات

\n

هذا هو الموضوع الأهم في Go. لا يمكن اجتياز المقابلة بدونه.

\n\n

ما هي الغوروتينة (goroutine) وكيف تختلف عن خيط نظام التشغيل؟

\n

الغوروتينة هي خيط خفيف الوزن يُدار بواسطة بيئة تشغيل Go. يبدأ مكدس الغوروتينة من 2-4 كيلوبايت (مقابل 1 ميجابايت لخيط نظام التشغيل). تعمل آلاف الغوروتينات على عدة خيوط من نظام التشغيل (نموذج M:N).

\n\n

كيف تعمل القنوات؟ أعط مثالاً لنمط تجمع العمال (worker pool).

\n
func worker(id int, jobs <-chan int, results chan<- int) {\n    for j := range jobs {\n        results <- j * 2\n    }\n}\n\nfunc main() {\n    jobs := make(chan int, 100)\n    results := make(chan int, 100)\n\n    // تشغيل 3 عمال\n    for w := 1; w <= 3; w++ {\n        go worker(w, jobs, results)\n    }\n\n    // إرسال المهام\n    for j := 1; j <= 5; j++ {\n        jobs <- j\n    }\n    close(jobs)\n\n    // جمع النتائج\n    for r := 1; r <= 5; r++ {\n        <-results\n    }\n}\n
\n\n

ما الفرق بين القناة المخزنة مؤقتًا (buffered) وغير المخزنة (unbuffered)؟

\n
    \n
  • غير مخزنة: يتم حظر المرسل حتى يستلم المستقبل الرسالة. اتصال متزامن.
  • \n
  • مخزنة: يتم حظر المرسل فقط عندما يكون المخزن ممتلئًا. اتصال غير متزامن.
  • \n
\n\n

كيف تتجنب الجمود (deadlock)؟

\n

استخدم select مع مهلة زمنية أو default:

\n
select {\ncase msg := <-ch:\n    fmt.Println(msg)\ncase <-time.After(1 * time.Second):\n    fmt.Println("timeout")\n}\n
\n\n

3. الواجهات، الأدوية (generics)، ومعالجة الأخطاء

\n

Go ليست لغة برمجة كائنية التوجه بحتة، لكن الواجهات تلعب دورًا رئيسيًا هنا.

\n\n

كيف تعمل البرمجة بنمط البط (duck typing) في Go؟

\n

النوع ينفذ الواجهة ضمنيًا إذا كان لديه جميع الطرق المطلوبة. هذا يسمح بكتابة كود مرن.

\n
type Stringer interface {\n    String() string\n}\n\ntype User struct {\n    Name string\n}\n\nfunc (u User) Str                

المدونات

توصيات الكتب