1 回答

TA貢獻1824條經驗 獲得超8個贊
我想我看到了你的錯誤。這個通常有點難以跟蹤,因為它只是:在等號的前面。這基本上是一個作用域問題,因為您聲明db為全局db變量,同時創建了一個作用域為您的主函數的變量。
您過去常常db, err := ...分配值,而不僅僅是=. :=將聲明和推斷類型。由于它也在進行聲明,因此db您在main函數中使用的不是db您在全局范圍內聲明的。同時,處理程序仍在嘗試使用db在全局范圍內聲明的 。下面的代碼與您最初使用的代碼相同,在代碼中添加了一些注釋以概述工作更改的內容。希望這可以幫助!
package main
import (
"fmt"
"log"
"net/http"
"github.com/boltdb/bolt"
)
var db *bolt.DB // this is going to be a pointer and is going to be nil until its set by the main function
func handler(w http.ResponseWriter, r *http.Request) {
dberr := db.Update(func(tx *bolt.Tx) error {
log.Println("here")
b := tx.Bucket([]byte("MyBucket"))
loving := b.Get([]byte("loving"))
log.Printf("He's loving %s but prefers %s", r.URL.Path[1:], string(loving))
fmt.Fprintf(w, "He's loving %s but prefers %s", r.URL.Path[1:], string(loving))
return nil
})
if dberr != nil {
fmt.Errorf("db update: %s", dberr)
}
log.Printf("Finished handling")
}
func main() {
var err error // this will have to be declared because of the next line to assign db the first value returned from `bolt.Open`
db, err = bolt.Open("my.db", 0600, nil) // notice that this has changed and is no longer `db, err := ...` rather its `db, err = ...`
if err != nil {
log.Fatal(err)
} else {
log.Println("database opened")
}
dberr := db.Update(func(tx *bolt.Tx) error {
b, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
err2 := b.Put([]byte("loving"), []byte("pizza"))
if err2 != nil {
return fmt.Errorf("put loving: %s", err2)
}
loving := b.Get([]byte("loving"))
log.Printf("He's loving %s", string(loving))
return nil
})
if dberr != nil {
fmt.Errorf("db update: %s", err)
}
defer db.Close()
http.HandleFunc("/", handler)
http.ListenAndServe(":3000", nil)
}
- 1 回答
- 0 關注
- 242 瀏覽
添加回答
舉報