Golangのchannelへのデータの送受信について




channel

Golangではchannelというキューのような仕組みがあります。channelを介してデータの受け渡しができるため、処理を分割して並列処理がしやすくなります。しかし、便利な半面むやみに使うと処理を追うのが大変になるので気をつけてください。

定義

channelにはcpacityというchannel内に保持しておけるバッファのサイズを定義することができます。バッファが0になるとchannelへのデータ送信はブロックされるので非常に重要な値となります。capacityを指定していない場合は0となります。

// capacityなし 0
ch := make(chan int)

// capacityあり 10
ch10 := make(chan int, 10)

close

close()関数を使うとchannelを閉じることができ、受信側に閉じたことを知らせることができます。閉じられたchannelにはデータの送受信ができません。

close(ch)

送信

channelへの送信は<-でできます。capacityが足りなくなった場合、受信されて容量があくまで送信処理がブロックされます。

ch <- 1

受信

受信方法はいろいろあるのですが一番基本的な2つを紹介します。

最初の方法はchannelから値だけを取得します。2つ目はokがfalseだった場合、channelがcloseされた通知を受け取り、vにはゼロ値が入ります。

// 値だけを受信
v <-ch

// channelがcloseされたかを確認
v, ok <-ch

おすすめ書籍

Go言語の初心者から上級者までしっかり学べる書籍となっています。

本書籍はサンプルコードが非常に豊富で、HTTP/Websockert通信、CLIツール、Google/Twitter API、MongoDB等を使った様々なアプリケーションの作り方を学べます。

Go言語特有のgorutine、channelに関してもしっかりと説明されているのでこの書籍を一通り写経するとGoの全体像がつかめるかと思います。もちろん自分は全て写経しました。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です