【问题标题】:golang and boltdb: using closures to wrap a bucket ForEach functiongolang 和 boltdb:使用闭包来包装一个桶 ForEach 函数
【发布时间】:2019-04-07 21:44:00
【问题描述】:

在我的代码中,我使用了很多重复代码来迭代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 的函数。

【问题讨论】:

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

标签: database go refactoring boltdb


【解决方案1】:

我并没有真正抓住你想要的东西,但我会尽力回答。

您可能有一个传递给 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2013-05-23
    • 2017-03-18
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多