0Pricing
Go Academy · درس

عبارة select

تعدد إرسال القنوات باستخدام select

عبارة select درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

ما هي select؟

تتيح عبارة select لـ goroutine الانتظار حتى تتم عدة عمليات على القنوات في الوقت نفسه. وتختار أول حالة تصبح جاهزة للمتابعة، على نحو مشابه لـ switch ولكن للقنوات.

الصياغة الأساسية

كل case في select هو إرسال إلى قناة أو استقبال منها:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

عدم الحجب باستخدام default

تؤدي إضافة حالة default إلى جعل select غير حاجب — فإذا لم تكن أي قناة جاهزة، ينتقل التنفيذ إلى default فورًا.

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

الاختيار العشوائي

عندما تكون عدة حالات جاهزة في الوقت نفسه، تختار Go إحداها عشوائيًا — إذ تملك كل حالة جاهزة فرصة متساوية للاختيار. ويمنع ذلك التجويع.

الإرسال في select

يمكن أن تكون الحالات أيضًا عمليات إرسال إلى القنوات. وتكون حالة الإرسال جاهزة عندما تتوفر مساحة في مخزن القناة المؤقت (أو عندما يكون مستقبِل بانتظارها).

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

تحجب select الفارغة التنفيذ إلى الأبد

تحجب عبارة select{} المجردة، التي لا تحتوي على حالات، goroutine الحالية إلى الأبد. وهذه طريقة شائعة لإبقاء goroutine الرئيسية قيد التشغيل أثناء تشغيل goroutine أخرى.

func main() {
    go serve()
    select {} // block forever
}

التكرار باستخدام select

غلّف select داخل حلقة for لتعدد إرسال القنوات باستمرار. أضف قناة done للخروج بطريقة نظيفة.

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

القنوات nil

تحجب القناة nil إلى الأبد عند استخدامها في حالة select، ما يؤدي فعليًا إلى تعطيل تلك الحالة. ويمكنك استخدام ذلك لتمكين الحالات أو تعطيلها ديناميكيًا أثناء التشغيل.

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

select مع القنوات المغلقة

ينجح الاستقبال من قناة مغلقة دائمًا فورًا، ويعيد القيمة الصفرية. استخدم صيغة القيمتين لاكتشاف الإغلاق.

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

أنماط تحديد الأولوية

لا تدعم Go الأولويات في select دعمًا أصليًا. ولإعطاء الأولوية لقناة معينة، يمكنك تداخل عبارات select أو استخدام حلقة تتحقق أولًا من القناة ذات الأولوية العالية مع default.

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

مراجعة حتى الآن

تنتظر select عدة قنوات، وتختار حالة جاهزة عشوائيًا، وتدعم default لعدم الحجب، بينما تعطل القنوات nil الحالات. النمط الشائع: for+select+done.

تحقق سريع

ماذا يحدث عندما تكون عدة حالات في select جاهزة في الوقت نفسه؟

مراجعة: عبارة select

النقاط الأساسية:

  • تحجب select التنفيذ حتى تصبح إحدى حالات القناة جاهزة
  • حالات جاهزة متعددة ← اختيار عشوائي
  • تجعل default التنفيذ غير حاجب
  • تعطل القناة nil حالتها
  • تُعد for+select+done حلقة تعدد الإرسال القياسية

الأسئلة الشائعة

هل درس «عبارة select» مجاني؟

نعم — نص درس «عبارة select» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «عبارة select»؟

تعدد إرسال القنوات باستخدام select تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «عبارة select»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. عبارة select
  2. المهلات والمؤقتات
  3. أنماط Fan-in وFan-out
  4. نمط مجموعة العمال
← العودة إلى Go Academy