はじめに
GoのChannelに関して学んでいる最中に,バッファという単語が出てきました.
聞いたことはあるけど,理解はできていない🤔
いい機会なので,調べてみました!
簡単に
データをやりとりするときの一時的な記憶領域
のこと.
きちんと
英語ではBufferと書いて,「緩衝材」のような意味を持つようです.
コンピュータの「一時的な記憶領域」のことを指していて,それが転じてビジネスでは「ゆとり」などの意味合いで使われるようになったらしです🤔
GoのChannelはデータを保持するためのデータ構造で,容量を指定できます.
これがバッファです.
cap
関数を使うことで,見ることができます.
channel := make(chan int, 5)
fmt.Println(cap(channel))
0
と出力されました.
このmake関数で,第2引数に指定された 5 がバッファサイズです.
今は何も受信していないため,容量は 0 と表示されました.
ではこの後に,以下のように送信すると,
channel <- 1
channel <- 2
channel <- 3
channel <- 4
channel <- 5
channel <- 6
fmt.Println(cap(channel))
fatal error: all goroutines are asleep - deadlock!
と出力されました.
この deadlock は保存領域が足りないよと言うことで,
バッファのサイズが足りないと怒られてしまったのですね🤔
Channelはqueueの性質を持っていで,バッファはqueueのサイズともいえます.
queueは先入れ先出しの性質を持っているので,
errorを解消するには,受信をしてしまえばいいのではないでしょうか.
channel <- 1
channel <- 2
channel <- 3
channel <- 4
fmt.Println(channel<-)
channel <- 5
channel <- 6
fmt.Println(cap(channel))
1
5
こんな感じで出力されました!
この 1
は先入された1ですね🤔
5
は保存されている容量だと思います.
まとめ
自分の手で動かしてみて,バッファは
データをやりとりするときの一時的な記憶領域
と言うことが理解できたような気がします🙋♂️