亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GoLang - bbolt - 無效的內存地址或零指針取消引用

GoLang - bbolt - 無效的內存地址或零指針取消引用

Go
海綿寶寶撒 2022-11-28 10:39:44
我正在嘗試使用文件數據庫 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。


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號