Upgrade to Pro — share decks privately, control downloads, hide ads and more …

チャンネルを完全に理解する

Avatar for Senoue Senoue
December 11, 2024

 チャンネルを完全に理解する

Sendai.go2024年12月11日のLTしたい資料です。

Avatar for Senoue

Senoue

December 11, 2024
Tweet

More Decks by Senoue

Other Decks in Programming

Transcript

  1. 瀬上 祐匡(せのうえ ひろまさ) 株式会社クラウドスミス テクニカルマネージャー • AWS,GCP, Go, Python等,BI,データ分析 •

    @senoue,@hiromasa.senoue • モノノフです。 • 好きなものは、Cloud Function • Sendai.go やってます • TynyGo-keebなど 自己紹介 株式会社クラウドスミス 仙台を拠点とした、Webシステム中心の開発会社です。
  2. - 定義: - チャンネルは、 Goroutine間でデータを送受信 するためのパイプです。 - 特徴: - 型指定される。

    - 複数のGoroutineから安全にデータを共有で きる同期機構がある。 1. チャンネルとは?
  3. - a. 宣言と作成 - - b. 送信と受信 - c. バッファ付きチャンネル

    2. チャンネルの基本操作 ch := make(chan int) // 整数 ch <- 10 // 送信 value := <-ch // 受信 ch := make(chan int, 3) // バッファサイズ 3 のチャンネル
  4. - a. Goroutine間通信 - 3. 実践的な使用例 func worker(id int, ch

    chan int) { for n := range ch { fmt.Printf("Worker %d received %d\n", id, n) } } func main() { ch := make(chan int) for i := 0; i < 3; i++ { go worker(i, ch) } for i := 0; i < 5; i++ { ch <- i } close(ch) } 実際の動作:https://go.dev/play/p/K54rceX7AUn
  5. - b. select を用いた多重チャネル操作 - 3. 実践的な使用例 func main() {

    ch1 := make(chan string) ch2 := make(chan string) go func() { ch1 <- "from channel 1" }() go func() { ch2 <- "from channel 2" }() for i := 0; i < 2; i++ { select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } } }
  6. - デッドロック : 送られた値を誰も受け取らない場 合、または相手がいない場合に発生。 - Channelの適切なクローズ (close) が必要。 -

    Goroutineリーク: 終了条件なく走り続ける Goroutineを避ける。 4. 注意点とベストプラクティス