https://www.yuque.com/abs/dr4...函數
使用 Tx.CreateBucket()
和 Tx.CreateBucketIfNotExists()
創建一個新桶(推薦使用第二個)
接受參數是 桶的名字事務
使用 Tx.DeleteBucket()
根據桶的名字來刪除作用域
func main() { db, err := bbolt.Open("./data", 0666, nil) if err != nil { log.Fatal(err) } defer db.Close() db.Update(func(tx *bbolt.Tx) error { b, err := tx.CreateBucketIfNotExists([]byte("MyBucket")) if err != nil { return fmt.Errorf("create bucket: %v", err) } if err = tx.DeleteBucket([]byte("MyBucket")); err != nil { return err } return nil }) }
最重要的部分,就是 kv 存儲怎麼使用了,首先須要一個 桶 來存儲鍵值對。get
使用 Bucket.Put()
來存儲鍵值對,接收兩個 []byte
類型的參數class
db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("MyBucket")) err := b.Put([]byte("answer"), []byte("42")) return err })
很明顯,上面的例子設置了 Pair: key:answer value:42date
使用 Bucket.Get()
來查詢鍵值。參數是一個 []byte
(別忘了此次咱們只是查詢,能夠使用 只讀事務)error
db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("MyBucket")) v := b.Get([]byte("answer")) fmt.Printf("The answer is: %s\n", v) return nil })
細心會注意到,Get
是不會返回 error
的,這是由於 Get()
必定能正常工做(除非系統錯誤),相應的,當返回 nil
時,查詢的鍵值對不存在。
⚠️:注意 0 長度的值 和 不存在鍵值對 的行爲是不同的。(一個返回是 nil, 一個不是)查詢
func main() { db, err := bolt.Open("./data.db", 0666, nil) if err != nil { log.Fatal(err) } defer db.Close() err = db.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucketIfNotExists([]byte("MyBucket")) if err != nil { return fmt.Errorf("create bucket: %v", err) } if err = b.Put([]byte("answer"), []byte("42")); err != nil { return err } if err = b.Put([]byte("zero"), []byte("")); err != nil { return err } return nil }) db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("MyBucket")) v := b.Get([]byte("noexists")) fmt.Println(reflect.DeepEqual(v, nil)) // false fmt.Println(v == nil) // true v = b.Get([]byte("zero")) fmt.Println(reflect.DeepEqual(v, nil)) // false fmt.Println(v == nil) // true return nil }) }
使用 Bucket.Delete()
刪除鍵值對db
db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("MyBucket")) fmt.Println(b.Get([]byte("answer"))) err := b.Delete([]byte("answer")) if err != nil { return err } return nil })
⚠️: Get()
獲取到的字節切片值只在當前事務(當前函數做用域)有效,若是要在其餘事務中使用須要使用 copy()
將其拷貝到其餘的字節切片