0
0

More than 1 year has passed since last update.

Go チャネルの基本的な知識

Posted at

チャネルとは

GoルーチンとGoルーチンの間でデータの受け渡しをするためのGo特有のデータ構造。

チャネルの型

チャネルの型はchan データ型のように書く。以下の例はint型のチャネルを作っている。

var ch chan int

チャネルの特性

チャネルの中に何かしらのデータを入れると、それを取り出してからでないと他のGoルーチンはチャネルに何のデータも入れることができない。またチャネルから何かデータを取り出そうとしたときに空だった場合、箱に何かが入るまでプログラムの実行は中断される。

←chanとすると受信専用チャネルになる。

var ch1 <-chan int

chan←とすると送信専用チャネルになる。

var ch2 chan<- int

特に指定しないと双方向のチャネルとなる。

チャネルのバッファ

チャネルはキューの性質を備えるデータ構造。キューは先入先出の性質があり、キューに先に入れられたデータは先に取得される。
バッファはこのキューを格納する領域のこと。チャネルでは生成時にバッファサイズを指定できる。

以下はバッファサイズ8のチャネル

ch := make(chan int, 8)

何も指定しないとバッファサイズは0になる。

ch := make(chan int)

試してみた

実際に以下のようなコードを書いてチャネルの動きを確認してみた。receiver()は引数でチャネルを受け取り、iにチャネルで受信したデータを格納し、出力する関数。
main()ではチャネルに整数iを送信する操作をi<10になるまで繰り返している。

package main
import (
"fmt"
)

func receiver(ch <-chan int) {
	for {
		i := <-ch
		fmt.Println(i)
	}
}

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

	i := 0
	for i < 10 {
		ch <- i
		i++
	}
}

結果

$ go run dogorutin.go
0
1
2
3
4
5
6
7
8
9

受信できている。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0