サイト名変更・お引越しのお知らせ

Go言語のチャネルの基本を解説

Go言語のチャネルの基本について解説します。

この記事でわかること
  • Go言語のチャネルの基本がわかる
  • Go言語のゴルーチンとの関係性がわかる

バージョン
  • Go 1.17

チャネルとゴルーチンの関係性

Goのプログラムは非同期で複数実行されるゴルーチンが動作するようにデザインされています。

チャネルはゴルーチン間でデータを受け渡すために設計されたGo言語特有のデータ構造となります。

モグモグさん

つまり、ゴルーチンの非同期処理を使わない箇所ではチャネルも使わないというのが原則です。

メモ

チャネルは、キューの性質があるデータ構造です。

キューは、FIFO(ファーストインファーストアウト)という性質があり、データを取り出す順序が保証されているのが特徴です。

定義方法

定義方法を2つ解説します。

チャネルは、特殊なサブタイプを指定でき下記の種類があります。

  • 受信・送信の双方向
  • 受信のみ
  • 送信のみ

makeを使わずに定義

// 双方向
var ch chan int

// 受信専用
var ch1 <-chan int

// 送信専用
var ch2 chan<- int

makeを使って定義

メモ

makeの2番目の引数には、「バッファサイズ」を整数で指定できます。

バッファサイズとは、データの格納する領域です。

// バッファサイズ指定なし = バッファサイズ0
ch3 := make(chan int)

// バッファサイズ指定あり
ch4 := make(chan int, 8)

チャネルへの送信と受信

<-を用いて送信と受信を行うことが可能です。

ch := make(chan int)

// 送信
ch <- 1

// 受信
result := <-ch

具体例

ゴルーチンと組み合わせて簡単なコード例を作ります。

send100関数で100を送信しmain関数の方で取り出しています。

func main() {
	ch := make(chan int)

	go send100(ch)

	x := <-ch
	fmt.Println(x)
}

func send100(ch chan int) {
	ch <- 100
}

lenとcap

チャネルは組み込み関数のlenとcapを使えます。

  • len: チャネルのデータ数
  • cap: チャネルのバッファサイズ

len

ch := make(chan int)

ch <- 1
len(ch) // 1

ch <- 2
len(ch) // 2

cap

ch := make(chan int)
cap(ch) // 0

ch2 := make(chan int, 5)
cap(c2) // 5

まとめ

Go言語のチャネルの基本について解説しました。

Go言語を学習している方の参考になれば幸いです。