English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي Golang

جملة التحكم Golang

دوال Golang & طرق

بنية Golang

قطع Golang & arrays

كلمات Golang (String)

مؤشرات Golang

واجهات Golang

تعاون Golang

استثناءات Golang (Error)

متنوعات Golang

جملة Select بلغة Go

في لغة Go،تشبه جملة selectجملة switch،لكن في جملة select،تعني جملة case الاتصال،أي عملية إرسال أو استقبال عبر القنوات.

النحو:

select{
case SendOrReceive1: // جملة
case SendOrReceive2: // جملة
case SendOrReceive3: // جملة
.......
default: // جملة

ملاحظة هامة:

  • ينتظر جملة select استعداد الاتصال (إرسال أو استقبال) حتى يمكن بدء بعض الحالات.

    package main
    import (
        "fmt"
        "time"
    )
    // الدالة 1
    func portal1(channel1 chan string) {
        time.Sleep(3 * time.Second)
        channel1 <- "مرحبًا بكم في قناة 1"
    }
    // الدالة 2
    func portal2(channel2 chan string) {
        time.Sleep(9 * time.Second)
        channel2 <- "مرحبًا بكم في قناة 2"
    }
    func main() {
        // إنشاء قنوات
        R1 := make(chan string)
        R2 := make(chan string)
        // استدعاء الدوال 1 و2 باستخدام goroutine
        go portal1(R1)
        go portal2(R2)
        select {
        // case 1
        case op1 := <-R1:
            fmt.Println(op1)
        // case 2
        case op2 := <-R2:
            fmt.Println(op2)
        }
    }

    النتيجة:

    مرحبًا بكم في قناة 1

    توضيح الاستخدام:في البرنامج المذكور أعلاه،يغفو portal1 لمدة 3 ثواني،ويغفو portal2 لمدة 9 ثواني،وبعد انتهاء وقت غفوتهما،سيعملان على الاستمرار. حاليًا،ينتظر جملة select وقت نومهما،عندما ينهي portal2 نومه،يختار case 2 ويقوم بإخراج "مرحبًا بك في قناة 1". إذا استيقظ portal1 قبل portal2،فسيقوم بإخراج "مرحبًا بك في قناة 2".

  • إذا لم يحتوي جملة select على أي جملة case،فسيظل الجملة select ينتظر إلى الأبد.

    النحو:

    select{}
    package main 
      
    func main() { 
          
       // لا يوجد أي case،سيظل ينتظر
       select{ } 
    }

    النتيجة:

    خطأ حاد: جميع goroutines في حالة النوم - تعطل!
    goroutine 1 [select (no cases)]:
    main.main()
        /home/runner/main.go:9 +0x20
    حالة الخروج 2
  • استخدام جملة default في جملة select用于 حماية جملة select من الحظر. عند عدم وجود جملة case جاهزة للتنفيذ، سيتم تنفيذ هذه الجملة.

    package main
    import "fmt"
    func main() {
        //إنشاء قنوات
        mychannel := make(chan int)
        select {
        case <- mychannel:
        default:
            fmt.Println("غير موجود")
        }
    }

    النتيجة:

    غير موجود
  • حالة الحظر في جملة select تعني أن جملة select ستكون مُحبوسة عندما لا تكون جملة case جاهزة للتنفيذ ولا تحتوي جملة select على جملة افتراضية، فإن جملة select ستكون مُحبوسة حتى يتم استعداد جملة case أو إرسال.

    package main
    func main() {
        //إنشاء قنوات
        mychannel := make(chan int)
        //لم يتم استعداد القناة بعد
        //لا يوجد جملة افتراضية
        select {
        case <- mychannel:
        }
    }

    النتيجة:

    خطأ حاد: جميع goroutines في حالة النوم - تعطل!
    goroutine 1 [chan receive]:
    main.main()
        /home/runner/main.go:14 +0x52
    حالة الخروج 2
  • في جملة select، إذا كنت مستعدًا لمعالجة عدة حالات، يمكنك اختيار حالة عشوائية.

    package main 
      
    import "fmt"
          
          
        //دالة 1 
        func portal1(channel1 chan string){ 
            for i := 0; i <= 3; i++{ 
                channel1 <- "مرحبًا بكم في قناة 1"
            } 
              
        } 
          
        //دالة 2 
         func portal2(channel2 chan string){ 
            channel2 <- "مرحبًا بكم في قناة 2"
        } 
      
    func main() { 
          
        //إنشاء قنوات 
       R1 := make(chan string) 
       R2 := make(chan string) 
         
       //استخدام طريقة goroutine لاستدعاء الدوال 1 و2
       go portal1(R1) 
       go portal2(R2) 
       
       //اختيار عشوائي
       select{ 
           case op1 := <- R1: 
           fmt.Println(op1) 
           case op2 := <- R2: 
           fmt.Println(op2) 
       } 
    }

    النتيجة:

    مرحبًا بكم في قناة 2