sink
って名前がわかりやすいなと思ったので忘れないようにメモ。
Goで巨大なデータを取得する処理の場合、配列に入れて返すのどうなんってなりがち。
func FetchTooBigData() ([]Datum, error) {
var data []Datum
...
data = append(data, Datum{...})
...
return data
}
メモリに全部載せるの流石にキツイ。
受け取るための某を作って引数で渡してやるのが設計的に簡単で良さそう。
type DataSink interface {
Add(Datum) error
}
func FetchTooBigData(sink DataSink) error {
...
if err := sink.Add(Datum{...}); err != nil {
return err
}
...
}
もっとちゃんと作り込んで、他の言語でよく見るチェーンっぽい書き方をするなら
type EnumerableData interface {
Next() bool
Current() Datum
}
func FetchTooBigData() (EnumerableData, error) {
... // よしなに
}
data, err := FetchTooBigData()
if err != nil {
panic(err)
}
for data.Next() {
datum := data.Current()
...後続処理
}
みたいなコルーチンじみたアレを作るんだろうけど、流石に面倒くさい。