戻る

Goにおけるチャネルの理解

ニキータ・ハビャ

ニキータ・ハビャ

7分読み

|

4 month前

Goroutinesの探求の記事で見たように、チャネルはGoroutines間の通信手段です。この記事では、channelsについてさらに詳しく探求していきます。

Channel とは?

チャネルの動作

チャネルはいつ使うべき? 🤔

channelsを深く学ぶ前に、実際に必要な場面を理解することが重要です。すべてのプログラムに並行処理が必要なわけではなく、channelsやgoroutineを追加するとコードが複雑になる可能性があります。

channelsを使用すべき場合

ほとんどのプログラムはシンプルに始まります。並行処理は、パフォーマンス向上や複数のタスクを同時に処理するなど、明確な必要性が生じた段階で導入できます。

Channels の操作 ⚒️

チャネルの作成:

チャネルは make() 関数を使用して作成します。チャネルを作成する際には、チャネルの データ型容量 を指定する必要があります。容量を指定しない場合、容量0のチャネルとなり、これは バッファなし チャネルと呼ばれます。

go
unbuffered := make(chan string) // バッファなしチャネル
go
buffered := make(chan int, 5) // 容量5のバッファ付きチャネル

チャネルへのデータ送信:

<- 演算子は、チャネルデータを送信するために使用されます。これは「このデータをチャネルに送信する」という意味です。

go
ch <- "データ"

チャネルからのデータ受信:

<- 演算子は、チャネルからデータを受信する際にも使用されますが、方向が逆になります。これは「チャネルからデータを受信する」ことを意味します。

go
data := <-ch

送信と受信の両方が、デフォルトではブロッキング操作です。

チャネルが閉じられているか確認する:

channelからデータを受信している間、チャネルが閉じられているかどうかを示すための2つ目のブール値『ok』も返します。

go
data, ok := <-ch
if !ok {
	fmt.Println("チャネルは閉じられています")
}

チャネルの閉じ方:

close()関数を使用して行います。チャネルを閉じることは、それ以上データが送信されないことを示します。メモリリークを回避し、受信側にデータ送信が終了したことを通知するため、チャネルを閉じることは非常に重要です。

go
close(ch)