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

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

golang http 處理程序上下文

golang http 處理程序上下文

Go
呼喚遠方 2021-11-15 17:07:59
我正在嘗試使用以下代碼了解 golang 中的變量范圍。在此示例中,在 http 中調用頁面將回顯 uri 查詢以及 Boltdb 中存儲的值。問題是數據庫驅動程序似乎沒有在 http 處理程序上下文中正確運行:它不會向 stdout 或 http 請求打印任何內容。我期待它打?。核矚g <'uri query content'> 但更喜歡披薩(來自 bolt.db 驅動程序的數據)如何修復此代碼?包主import (    "fmt"    "net/http"    "log"    "github.com/boltdb/bolt")var db bolt.DBfunc 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() {    db, err := bolt.Open("my.db", 0600, nil)    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(":8080", nil)   }
查看完整描述

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)

}



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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