Goならわかるシステムプログラミング2版2章読書メモ
Goならわかるシステムプログラミング2版2章読書メモ
io.Writer
io.Writer
インターフェースはWrite()
を持っていればなんでもio.Writer
インターフェースになる。
bytes.Buffer
bytes.Buffer
はOSが提供する出力先に伝えずWrite()
で書き込まれた内容をためておくだけのio.Writer
の実装。io.Reader
でもあるから、あとからためたものをRead()
で読み込める。
bytes.Buffer
にはWriterString()
が生えてるけど、他のio.Writer
の実装には生えてない。他のio.Writer
実装でも使えるstringを書き込む方法としてio.WriteString()
がある。
bytes.Buffer
を他の実装に置き換える可能性がある場合はio.WriteString()
を使ったほうがいいかも?
bufio.Writer
分量をある程度まとめてからio.Writer
にWrite()
ための構造体。Flush()
を叩くと書き込まれる。
他の言語でバッファ付き出力と呼ばれている機能。たしか、Pythonだったらデフォルトで標準出力がバッファリングされるからバッファリングしたくなかったら print()
にflush=True
を渡さないといけなかったはず。Golangだとバッファリングはデフォルトでしないから、もししたかったらbufio.Writer
を使う必要がある。
本書のコラムに「最近のコンピュータならバッファリングしなくてもパフォーマンス的に問題ないと判断したんじゃないかなあ」という話が書いてある。
io.Writer
を利用するフィルタ
io.Writer
にWrite()
する前に何らかの処理をするフィルタは簡単に実装できる。e.g. io.MultiWriter
手順としてはこんな感じ。
-
io.Writer
を持つstructを定義する - そのstructのメソッドの中で、もとの
io.Writer
にWrite()
する前にフィルタ処理を行う。
Q.2.1
Q2.2
encoding/csv
のNewWriter()
はio.Writer
のフィルタで、渡したio.Writer
はbufio.Writer
にさらにラップされていたし、csv.Writer
のWrite()
はio.Writer
のWrite()
に準拠していいなかった。
io.Writer
のwrapperもio.Writer
であったほうが使い勝手がいいのかなと思ったけど、別にそういうわけでもなく、ユースケースに合わせてうまく処理すればいいっぽい。
Q2.3
io.MultiWriter
でgzip.Writer
とos.Stdout
を包んだら、そいつをjson.NewEncoder()
に渡せばよさそう。
Discussion