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

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

Senoue
December 11, 2024

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

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

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. 注意点とベストプラクティス