golang и boltdb: использование замыканий для переноса функции ForEach - PullRequest
0 голосов
/ 08 апреля 2019

В моем коде я использую много повторяющегося кода для перебора вложенных сегментов в базе данных 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.

1 Ответ

0 голосов
/ 10 апреля 2019

На самом деле я не понял, что вы хотите, но я постараюсь ответить.

Возможно, у вас есть аргумент обратного вызова, который вы передаете в ForEach

    func ForEachBucket(db *bolt.DB, bucketname string, f func(b *bolt.Bucket) error {
        // ...
        return mapBucket.ForEach(f) // do not forget about returned error here
    }

Более общее: https://play.golang.org/p/LQlZHOWZTfi

...