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

Golang 基礎チュートリアル

Golang 制御文

Golang 関数 & メソッド

Golang 構造体

Golang スライス & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行

Golang エラ(Error)

Golang その他の雑多

Go 言語のSelect文

Go言語では、select文は以下のように似ていますswitch文ただし、select文ではcase文は通信を指し、チャネル上の送信または受信操作を意味します。

文法:

select{
case SendOrReceive1: // 文
case SendOrReceive2: // 文
case SendOrReceive3: // 文
……
デフォルト: // 文

重要事項:

  • Select文は通信(送信または受信操作)が準備でき次第、特定の状況で開始するための待機を行います。

    package main
    import (
        "fmt"
        "time"
    )
    // 関数 1
    func portal1(channel1 chan string) {
        time.Sleep(3 * time.Second)
        channel1 <- "Welcome to channel 1"
    }
    // 関数 2
    func portal2(channel2 chan string) {
        time.Sleep(9 * time.Second)
        channel2 <- "Welcome to channel 2"
    }
    func main() {
        // チャンネルを作成する
        R1 := make(chan string)
        R2 := make(chan string)
        // goroutineを使用して関数を呼び出す1および関数2
        go portal1(R1)
        go portal2(R2)
        select {
        // case 1
        case op1 := <-R1:
            fmt.Println(op1)
        // case 2
        case op2 := <-R2:
            fmt.Println(op2)
        }
    }

    出力:

    Welcome to channel 1

    使用法説明:上記のプログラムでは、portal1休眠3秒、portal2休眠9秒、休眠時間が終わった後、それらは继续する準備が整います。今、select文はそれらの休眠時間を待機しています。2目覚めた場合、それはcaseを選択します。 2を開き、"Welcome to channel"と出力する 1"。もしポート1portal2前もって目覚めると、"Welcome to channel"と出力されます。 2。

  • select文にcase文が含まれていない場合、そのselect文は常に待機します。

    文法:

    select{}
    package main 
      
    func main() { 
          
       //caseが何もない場合、常に待機します
       select{ } 
    }

    出力:

    致命的なエラー: 全てのgoroutineが眠っています - deadlock!
    goroutine 1 [select (no cases)]:
    main.main()
        /home/runner/main.go:9 +0x20
    終了ステータス 2
  • select文のデフォルト文は、select文がブロッキングされないように保護するために使用されます。case文が準備されていない場合、この文を実行します。

    package main
    import "fmt"
    func main() {
        //チャンネルを作成する
        mychannel := make(chan int)
        select {
        case <-mychannel:
        デフォルト:
            fmt.Println("Not found")
        }
    }

    出力:

    見つかりませんでした
  • select文のブロッキングは、case文が準備されていない場合、およびselect文にデフォルト文が含まれていない場合、select文がブロッキングし、少なくとも1つのcase文または通信が準備されるまで待機します。

    package main
    func main() {
        //チャンネルを作成する
        mychannel := make(chan int)
        //チャンネルが準備されていません
        //デフォルトの文がない
        select {
        case <-mychannel:
        }
    }

    出力:

    致命的なエラー: 全てのgoroutineが眠っています - deadlock!
    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 <- "Welcome to channel 1"
            } 
              
        } 
          
        //関数 2 
         func portal2(channel2 chan string){ 
            channel2 <- "Welcome to channel 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) 
       } 
    }

    出力:

    Welcome to channel 2