1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

バッファって何?

Posted at

はじめに

GoのChannelに関して学んでいる最中に,バッファという単語が出てきました.
聞いたことはあるけど,理解はできていない🤔
いい機会なので,調べてみました!

簡単に

データをやりとりするときの一時的な記憶領域
のこと.

きちんと

英語ではBufferと書いて,「緩衝材」のような意味を持つようです.
コンピュータの「一時的な記憶領域」のことを指していて,それが転じてビジネスでは「ゆとり」などの意味合いで使われるようになったらしです🤔

GoのChannelはデータを保持するためのデータ構造で,容量を指定できます.
これがバッファです.
cap関数を使うことで,見ることができます.

main.go
channel := make(chan int, 5)
fmt.Println(cap(channel))
terminal
0

と出力されました.
このmake関数で,第2引数に指定された 5 がバッファサイズです.
今は何も受信していないため,容量は 0 と表示されました.

ではこの後に,以下のように送信すると,

main.go
channel <- 1
channel <- 2
channel <- 3
channel <- 4
channel <- 5
channel <- 6
fmt.Println(cap(channel))
terminal
fatal error: all goroutines are asleep - deadlock!

と出力されました.
この deadlock は保存領域が足りないよと言うことで,
バッファのサイズが足りないと怒られてしまったのですね🤔

Channelはqueueの性質を持っていで,バッファはqueueのサイズともいえます.
queueは先入れ先出しの性質を持っているので,

errorを解消するには,受信をしてしまえばいいのではないでしょうか.

main.go
channel <- 1
channel <- 2
channel <- 3
channel <- 4
fmt.Println(channel<-)
channel <- 5
channel <- 6
fmt.Println(cap(channel))
terminal
1
5

こんな感じで出力されました!
この 1 は先入された1ですね🤔
5 は保存されている容量だと思います.

まとめ

自分の手で動かしてみて,バッファは
データをやりとりするときの一時的な記憶領域
と言うことが理解できたような気がします🙋‍♂️

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?