我正在嘗試使用文件數據庫 bbolt 作為鍵/值存儲。下面是我的代碼package handlerimport ( "encoding/json" "log" "net/http" "os" "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt" yml "gopkg.in/yaml.v3")type urlDB struct { db *bbolt.DB}func (u urlDB) ensureDB() { u.db, _ = bolt.Open("url.db", 0600, nil)}func MapHandler(pathsToURLs map[string]string, fallback http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { path := r.URL.Path if _, ok := pathsToURLs[path]; ok { http.Redirect(w, r, pathsToURLs[path], http.StatusFound) } else { fallback.ServeHTTP(w, r) } }}func DefaultMap(fallback http.Handler) http.HandlerFunc { db := urlDB{} db.ensureDB() //bkt := db.db.createBucket() //createSampleData(bkt) defer db.db.Close() bktName := "URLBucket" createBucket(db.db, bktName) addSampleData(db.db, bktName, "/gm", "https://mail.google.com") addSampleData(db.db, bktName, "/ym", "https://mail.yahoo.com") pathToURLs := make(map[string]string) getData(db.db, bktName, pathToURLs) return MapHandler(pathToURLs, fallback)}func createBucket(db *bbolt.DB, bktName string) { db.Update(func(tx *bbolt.Tx) error { _, _ = tx.CreateBucketIfNotExists([]byte(bktName)) return nil })}func addSampleData(db *bbolt.DB, bktName, key, value string) { db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte(bktName)) _ = b.Put([]byte(key), []byte(value)) return nil })}func getData(db *bbolt.DB, bktName string, pathToURLs map[string]string) { db.View(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte(bktName)) c := b.Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { pathToURLs[string(k)] = string(v) } return nil })}因此,在handler:DefaultMap使用以下代碼從 main.go調用它時mux := http.NewServeMux()var urlHandler http.HandlerFunc urlHandler = handler.DefaultMap(mux)http.ListenAndServe(":8080", urlHandler)
1 回答

慕慕森
TA貢獻1856條經驗 獲得超17個贊
這一行:
github.com/xx/urlshortner/handler.createBucket(0x6c588d, {0x6c6358, 0xc000187ec8})
說錯誤在createBucket. 看著createBucket:
db.Update(func(tx *bbolt.Tx) error {
根據堆棧跟蹤,它調用Update,并且db是這里唯一可以為 nil 的東西。
追蹤回調,可以看到:
func (u urlDB) ensureDB() {
u.db, _ = bolt.Open("url.db", 0600, nil)
}
因此,db open 失敗,并且u.db為 nil。
- 1 回答
- 0 關注
- 97 瀏覽
添加回答
舉報
0/150
提交
取消