В моем коде я использую много повторяющегося кода для перебора вложенных сегментов в базе данных bolddb.Я хотел бы провести некоторый рефакторинг, заключив эти повторяющиеся коды в новые функции.
Я знаю, что для этого нужно использовать замыкания, но дополнительный слой db.View вызывает у меня головную боль.
ПодробнееТочно, я хотел бы обернуть функцию bucket.ForEach в новую функцию.Эта функция создает транзакцию просмотра базы данных, выбирает вложенную корзину и возвращает новую функцию, которая позволяет мне выполнять итерации по данной корзине.
Подпись кода вновь созданного кода будет выглядеть примерно так:
ForEachBucket(bucket_name string, *bolt.DB) func() {}
Код, который я хочу обернуть:
func ForEachBucket(bucketname string, db *bolt.DB) {
db.View(func(tx *bolt.Tx) error {
rootBkt := tx.Bucket([]byte("rootbucket")) // always the same
interestingBkt := rootBkt.Bucket([]byte(bucketname))
if nestedBkt := interestingBkt.Bucket([]byte("underlying")); nestedBkt != nil {
mapBkt.ForEach(func(k, v []byte) error {
// do something here
}
})
return nil
})
}
Я хочу создать новую функцию (используя замыкания), которая оборачивает вышеуказанный код и возвращает функцию, похожую на foreach.