如何将类型传递给 http 处理程序

我试图通过为它们创建一个新包来将我的 http go 代码分成“控制器”,但无法弄清楚如何将 db 类型传递到处理程序中。我希望能够将我在 main.go 中创建的 Db 类型传递到我在 index.go 中的索引处理程序中。如果这是解决此问题的错误方法,请告诉我更好的方法(我正在学习,现在希望保持简单)。到目前为止我的代码:


main.go:


package main


import (


    "database/sql"

    "fmt"

    _ "github.com/go-sql-driver/mysql"

    "github.com/gorilla/mux"

    "log"

    "mvc3/app/c"

    "net/http"

)


var Db *sql.DB


func main() {


    fmt.Println("Starting up!")


    var err error

    Db, err = sql.Open("mysql", "root@/dev?charset=utf8")

    if err != nil {

        log.Fatalf("Error on initializing database connection: %s", err.Error())

    }


    Db.SetMaxIdleConns(100)


    err = Db.Ping()

    if err != nil {

        log.Fatalf("Error on opening database connection: %s", err.Error())

     }


     r := mux.NewRouter()

     r.HandleFunc("/", c.Index)


    http.Handle("/", r)

    http.ListenAndServe(":8080", nil)

}

/app/c/index.go:


package c


import (

    "fmt"

    "net/http"

)


func Index(w http.ResponseWriter, r *http.Request) {


    fmt.Fprintf(w, "Hello world!")


}

谢谢!


鸿蒙传说
浏览 179回答 1
1回答

Cats萌萌

使用闭包。在 app/c 中将索引更改为:func Index(db *sql.DB) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        // do stuff with db here        fmt.Fprintf(w, "Hello world!")    }}然后在你的主函数中像这样使用它: r.HandleFunc("/", c.Index(db))Index 函数返回一个适合 HandleFunc 类型的匿名函数,并且还关闭传递给您的处理程序访问该变量的 db 的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go