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

标签 go

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

ma​​in.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!")

}

谢谢!

最佳答案

使用闭包。

在 app/c 中将 Index 更改为:

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 类型的匿名函数,并关闭传递给您的处理程序访问该变量的数据库的值。

关于go - 如何将类型传递给 http 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17779204/

相关文章:

go - 无法在 Golang 中的 RethinkDB 上运行过滤器

curl - net/http vs curl - 为什么在 curl 不超时的情况下超时?

arrays - Go中的初始化结构数组

go - 是在赋值给结构原子吗?

xml - 如何使用 gokogiri (libxml2) 解析带有命名空间的 xml?

go - 在 goroutines 中调用 C.malloc/C.free 时的内存泄漏

go - 在这种情况下使用 redis 池的正确方法

database - 如何使用 docker-compose 运行 golang-migrate?

go - 如何将结构转换为基本类型,而不是 Go 中的直接类型?

json - 如何在 Golang 中测试 panic ?