簡単にまとめてみました。バッファリングについては取り扱いません。bufferingbufio.Scanner考察バッファはなんらかの入出力の一部を一時的に保存する領域を指します。バッファはIOの回数を減らしてパフォーマンスを向上させますが、バッファサイズを制限することはメモリ圧迫を防ぐことにも一役買っています。ファイルをコピーするプログラムで大きなファイルを取り扱うケースを考えてみましょう。バッファなど考えずにすべてを読み込んでファイルに出力するとメモリを圧迫する可能性があります。する)を確保し4KBずつ読み出してバッファに格納&コピー先のファイルに書き出す、という操作を繰り返せば最大でも4KBしか消費されないのでメモリを圧迫する恐れがありません。バッファは小さいほどよいかといえばそうではありません。読み込んでいたら大量のIOが発生しものすごい時間がかかるかもしれません。バッファサイズは省メモリとパフォーマンスのトレードオフ関係にあります。通常のシステムではスペックに合わせて適切なバッファサイズを設定することが望ましいですが、当記事ではわかりやすさを考慮して小さなサイズのバッファを使うことがあります。おけるバッファは主にbyte型のスライス([]byte)で表現されます。バッファに対してIOから読み書きを行うんですが、ネットワークやファイルなどIOにもいくつか種類があります。IOごとにバラバラの読み書き方法があるとめんどくさいのでGolangでは読み書きの方法(メソッド)がある程度統一されています。備考この統一されたメソッドを変数に対して強制させるのがインタフェースです。インタフェースにはメソッドにどのような引数を渡してどのような値が返却されるべきかが定義されており、インタフェース型変数に格納される値にメソッドが定義されていなければビルドが通らないようになっています。ioパッケージに以下のように定義されており、利用者はインタフェースを見るだけでどのように呼び出せばいいかがわかります。error)}標準、準標準パッケージのIOをはじめ、多くのIOはこれらのインタフェースを満たすように設計されています。私達はインタフェースを使って抽象的なコードを書くことができます。書く場合もこれらのインタフェースを満たすように設計すべきです。引数のファイルを第二引数のファイルにコピーする(cpコマンドのような)プログラムを書いてみました。5バイトのバッファを使って泥臭く読み書きを繰り返しているだけです。処理をわかりやすくするためにエラーハンドリングや後処理は書きませんでした。バッファを受け取って、読み込んだバイト数を返しているところです。切り出したバッファを書き込んでいます。バッファには前に読み込んだバイト列が残っているので切り出さないと予期せぬ内容が書き込まれてしまいます。いう構造体が定義されていて、これをバッファとして使うこともできます。関数を使うと初期バッファは利用者が指定できます。correctly.}フィールドは外部からアクセスできませんが、バッファを操作するためのメソッドが用意されています。プログラムを利用して対話的に結果を見ていきます。Write関連のメソッドって向きがさっきと逆じゃねーかと思ってしまいそうですが、これらはIOとして呼ばれることが前提となっているメソッドなので「引数であるバッファ」が主語になります。IOのように振る舞います。出力された値をバッファに格納できます。先程のように別のIOの読み書きはどうやるんでしょうか。インタフェースが引数となっているので、適切なIOを渡してやるだけです。ファイルを読み込んで表示するだけのプログラムを作りました。例のごとくエラーハンドリングはしてません。バイトのバッファが使われます。大きなバッファを渡してあげましょう。意味であり、バッファへの書き込みを制限できるという意味のキャパシティではありません。キャパシティを超えて書き込まれれば自動的にアロケーションされます。書き込まれた内容を際限なく溜め込みます。メソッドで削除しましょう。IOをラップしてそこに対する入出力をバッファリングする標準パッケージです。IOアクセス処理で透過的にバッファを利用します。ファイルを表示するためのプログラムを書いてみました。使ったコードより行数が増えています。内部のバッファに上限を持たないため、読み込んだものをすべてバッファに入れることが可能です。実際、先程のコードは一気に読み込んで一気に出力していた(かつエラーハンドリングもしてない)のであれだけ短くできました。ともにバッファに上限を持つため、バッファを超える入出力を考慮して繰り返し読み書きするプログラムを書く必要があります。めんどくさくはありますが、メモリが有限なことを考えればこちらのほうが現実的です。buffering通常、IOへの書き込みでは自動的にバッファされないため、連続した読み書きを行うとパフォーマンス劣化を招く恐れがあります。IOへの書き込みが発生するため、IOアクセスを抑えパフォーマンス向上につながります。使っていましたが、正直あれだけではありがたみがわからないので書き込み回数ごとに実行時間を計測するプログラムを書きました。0.056s毎回書き込んでるのは一番遅く、書き込み回数が減るごとにパフォーマンスが向上しているのがわかります。デフォルトのバッファサイズが一番大きいので最速のはずですが、結構ブレが大きくて1Kのバッファが一番速くなることもよくありました。1行ごとにテキストを読み込む機能です。使って動きを見てみましょう。メソッドで読み込んだ(改行コードを除いた)テキストを返却します。メソッドを呼ぶのが一般的な使い方だと思います。以下は標準入力から受け取った1行の文字列をそのまま返却するエコーサーバです。