📄

Goならわかるシステムプログラミング2版2章読書メモ

2023/02/14に公開

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.WriterWrite()ための構造体。Flush()を叩くと書き込まれる。

他の言語でバッファ付き出力と呼ばれている機能。たしか、Pythonだったらデフォルトで標準出力がバッファリングされるからバッファリングしたくなかったら print()flush=Trueを渡さないといけなかったはず。Golangだとバッファリングはデフォルトでしないから、もししたかったらbufio.Writerを使う必要がある。

本書のコラムに「最近のコンピュータならバッファリングしなくてもパフォーマンス的に問題ないと判断したんじゃないかなあ」という話が書いてある。

io.Writerを利用するフィルタ

io.WriterWrite()する前に何らかの処理をするフィルタは簡単に実装できる。e.g. io.MultiWriter

手順としてはこんな感じ。

  1. io.Writerを持つstructを定義する
  2. そのstructのメソッドの中で、もとのio.WriterWrite()する前にフィルタ処理を行う。

Q.2.1

https://github.com/roronya/go-system-programming/blob/main/chapter2/Q2.1/main.go

Q2.2

encoding/csvNewWriter()io.Writerのフィルタで、渡したio.Writerbufio.Writerにさらにラップされていたし、csv.WriterWrite()io.WriterWrite()に準拠していいなかった。

io.Writerのwrapperもio.Writerであったほうが使い勝手がいいのかなと思ったけど、別にそういうわけでもなく、ユースケースに合わせてうまく処理すればいいっぽい。

https://github.com/roronya/go-system-programming/blob/main/chapter2/Q2.2/main.go

Q2.3

io.MultiWritergzip.Writeros.Stdoutを包んだら、そいつをjson.NewEncoder()に渡せばよさそう。

https://github.com/roronya/go-system-programming/blob/main/chapter2/Q2.3/main.go

GitHubで編集を提案

Discussion