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