登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-12 18:42:31 206浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《golang和boltdb:使用闭包包装桶ForEach函数》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

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


解决方案


我实际上没有明白你想要什么,但我会尽力回答。

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>