【Go】select文の詳しい説明

目次

select ステートメント


select

selectステートメントは、複数の通信操作から選択するための制御構造として Go 言語で広く使用されています。ステートメントの一般的な使用例をいくつか示しますselect

  1. マルチチャネル選択:selectステートメントは、複数のチャネルの読み取りおよび書き込み操作を同時に監視し、処理する実行可能な操作の 1 つを選択できます。ステートメントを通じてselect、並行プログラムでの多重化を実現し、ブロックや待機を回避できます。これはselectステートメントの最も一般的な使用法の 1 つです。
select {
case <-channel1:
    // 处理channel1接收操作
case data := <-channel2:
    // 处理channel2接收操作
case channel3 <- value:
    // 处理channel3发送操作
default:
    // 当没有任何通信可用时执行该分支
}
  • タイムアウト処理:selectステートメントをtime.After関数と組み合わせて使用​​して、操作のタイムアウト制御を実装できます。selectステートメントにタイマチャネルを追加することで、指定した時間内での処理の完了を待ち、設定時間を超えた場合にタイムアウト処理を行うことができます
timeout := time.After(5 * time.Second)
select {
case result := <-dataChannel:
    // 处理接收到的数据
case <-timeout:
    // 执行超时处理
}
  • ブロッキングおよびノンブロッキング オプション:selectステートメントはdefaultブランチと連携して、ノンブロッキング通信操作を実装できます。通信が利用できない場合、selectステートメントはdefault待機をブロックすることなく、ブランチ内のコードをただちに実行します。
select {
case data := <-channel:
    // 处理接收到的数据
default:
    // 没有任何通信可用时立即执行该分支
}
  • プログラム終了制御:selectステートメントを特別な終了チャネルと組み合わせて使用​​して、プログラムの終了を制御できます。終了チャネルをリッスンすることにより、プログラムを終了する必要があるときに終了操作をトリガーできます。
done := make(chan bool)
select {
case <-interruptChannel:
    // 处理中断事件
    done <- true
case <-terminateChannel:
    // 处理终止事件
    done <- true
case <-done:
    // 接收到退出信号,结束程序
}
  • select は、チャネルの 1 つが準備できるまで、1 つ以上のチャネルを同時に監視できます。
package main

import (
	"fmt"
	"time"
)

func test1(ch chan string) {
	time.Sleep(time.Second * 5)
	ch <- "test1"
}
func test2(ch chan string) {
	time.Sleep(time.Second * 2)
	ch <- "test2"
}

func main() {
	// 2个管道
	output1 := make(chan string)
	output2 := make(chan string)
	// 跑2个子协程,写数据
	go test1(output1)
	go test2(output2)
	// 用select监控
	select {
	case s1 := <-output1:
		fmt.Println("s1=", s1)
	case s2 := <-output2:
		fmt.Println("s2=", s2)
	}
}

  • 複数のチャネルが同時に準備できている場合、ランダムに 1 つを選択して実行します

 

package main

import (
   "fmt"
)

func main() {
   // 创建2个管道
   int_chan := make(chan int, 1)
   string_chan := make(chan string, 1)
   go func() {
      //time.Sleep(2 * time.Second)
      int_chan <- 1
   }()
   go func() {
      string_chan <- "hello"
   }()
   select {
   case value := <-int_chan:
      fmt.Println("int:", value)
   case value := <-string_chan:
      fmt.Println("string:", value)
   }
   fmt.Println("main结束")
}

おすすめ

転載: blog.csdn.net/fanjufei123456/article/details/131315632