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