Database golang和boltdb:使用闭包包装bucket ForEach函数

Database golang和boltdb:使用闭包包装bucket ForEach函数,database,go,refactoring,boltdb,Database,Go,Refactoring,Boltdb,在我的代码中,我使用大量重复代码来迭代bolddb数据库中的嵌套bucket。我想做一些重构,将这些重复代码包装到新函数中 我知道我需要使用闭包,但是额外的db.View层让我头疼 更准确地说,我想将bucket.ForEach函数包装成一个新函数。这个函数创建数据库的视图事务,选择嵌套的bucket并返回一个新函数,让我可以迭代给定的bucket 新创建代码的代码签名如下所示: ForEachBucket(bucket_name string, *bolt.DB) func() {} 我要包

在我的代码中,我使用大量重复代码来迭代bolddb数据库中的嵌套bucket。我想做一些重构,将这些重复代码包装到新函数中

我知道我需要使用闭包,但是额外的db.View层让我头疼

更准确地说,我想将bucket.ForEach函数包装成一个新函数。这个函数创建数据库的视图事务,选择嵌套的bucket并返回一个新函数,让我可以迭代给定的bucket

新创建代码的代码签名如下所示:

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的函数。

我实际上没有捕获您想要的,但我会尝试回答

您可以将回调参数传递给ForEach

func ForEachBucket(db*bolt.db,bucketname字符串,f func(b*bolt.Bucket)错误{
// ...
return mapBucket.ForEach(f)//不要忘记这里返回的错误
}

更一般地说:

问题是什么?我澄清了我的帖子,这样可以吗?仍然没有明确的问题。你想要什么,你尝试了什么,遇到了什么问题,最后是关于这个问题的问题。我想创建一个新函数来替换我编写的代码:打开一个新的(只读)使用
db.View查看数据库事务,使用
tx.bucket
选择右rootbucket和底层bucket。如果我只包装一级bucket选择和后续循环,我可以编写如下内容: