在我的代码中,我使用了很多重复的代码来遍历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的函数。
答案 0 :(得分:0)
我实际上并没有抓住你想要的东西,但是我会尽力回答。
您可能有一个传递给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
}