Я написал итератор для более легкого доступа к некоторым постраничным результатам БД, но как можно уменьшить дублирование?
foo_iterator.go
type FooIterator struct {
hasNext bool
app *App
batchSize int
}
func NewFooIterator(app *App, batchSize int) *FooIterator {
return &FooIterator{
hasNext: true,
app: app,
batchSize: batchSize,
}
}
func (it *FooIterator) HasNext() bool {
return it.hasNext
}
func (it *FooIterator) Next() []*model.Foo {
offset := 0
batch := it.app.GetAllFoosInPages(offset, it.batchSize)
if len(batch) < it.batchSize {
it.hasNext = false
}
offset += it.batchSize
return batch
}
bar_iterator.go
type BarIterator struct {
hasNext bool
app *App
batchSize int
}
func NewBarIterator(app *App, batchSize int) *BarIterator {
return &BarIterator{
hasNext: true,
app: app,
batchSize: batchSize,
}
}
func (it *BarIterator) HasNext() bool {
return it.hasNext
}
func (it *BarIterator) Next() []*model.Bar {
offset := 0
batch := it.app.GetAllBarsInPages(offset, it.batchSize)
if len(batch) < bi.batchSize {
it.hasNext = false
}
offset += it.batchSize
return batch
}
Использование
fooIterator := NewFooIterator(a, 100)
for fooIterator.HasNext() {
fooBatch := rolesIterator.Next()
// Do stuff
}
Они оба настолько похожи, что должен быть какой-то хороший способ поделиться кодом, но все, что я пробовал, кажется неловким.