簡答:是!你可以有嵌套桶:https://twitter.com/boltdb/status/454730212010254336
長答案:你的代碼工作正常!下面是一些需要檢查的內容:
- 您是否正在檢查正確的螺栓數據庫文件? botlt db文件將在您運行代碼的目錄中創建,除非您指定了絕對路徑。
- 您的輸入是否包含足夠的元素來創建嵌套結構?
我已經跑了以下設置(一對夫婦的小變化,但沒什麼大事)你的代碼,它工作正常:
package main
import (
"log"
"os"
"time"
"github.com/boltdb/bolt"
)
var dbname = "test.bdb"
var dbperms os.FileMode = 0770
var options = &bolt.Options{Timeout: 1 * time.Second}
func main() {
var names []string
names = append(names, "bucketOne")
names = append(names, "bucketTwo")
names = append(names, "bucketThree")
if err := CreateNestedBuckets(names); err != nil {
log.Fatal(err)
}
}
// CreateNestedBuckets - Function to create
// nested buckets from an array of Strings
func CreateNestedBuckets(buckets []string) error {
db, dberr := bolt.Open(dbname, dbperms, options)
if dberr != nil {
log.Fatal(dberr)
}
defer db.Close()
err := db.Update(func(tx *bolt.Tx) error {
var bkt *bolt.Bucket
var err error
first := true
for _, bucket := range buckets {
log.Println(bucket)
if first == true {
bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
first = false
} else {
bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
}
if err != nil {
log.Println("error creating nested bucket")
return err
}
}
return nil
})
if err != nil {
log.Println("error creating nested bucket!!!")
return err
}
return nil
}
要測試你可以貓通過字符串的文件的命令:
cat test.bdb | strings
bucketThree
bucketTwo
bucketOne
如果您在Windows上,我不確定等效命令是什麼,但是您可以用記事本打開文件並手動檢查它。它不會很漂亮,但你仍然應該在那裏看到你的桶的名字。
另一方面,錯誤處理將導致連續打印非常類似的消息。這裏有一個稍微乾淨的解決方案,你可以使用:
// CreateNestedBucketsNew - function to create
// nested buckets from an array of Strings - my implementation
func CreateNestedBucketsNew(buckets []string) (err error) {
err = db.Update(func(tx *bolt.Tx) (err error) {
var bkt *bolt.Bucket
for index, bucket := range buckets {
if index == 0 {
bkt, err = tx.CreateBucketIfNotExists([]byte(bucket))
} else {
bkt, err = bkt.CreateBucketIfNotExists([]byte(bucket))
}
if err != nil {
return fmt.Errorf("Error creating nested bucket [%s]: %v", bucket, err)
}
}
return err
})
return err
}
我一直創建嵌套桶。這段代碼看起來應該起作用。是什麼讓你認爲後續的桶不會被創建?也許測試代碼有問題?當我遇到Go代碼的問題時,我通常使用%v或%#v爲有問題的變量引入fmt.Printf,並將其清除。 – WeakPointer