Go 如何将类型传递到http处理程序中

Go 如何将类型传递到http处理程序中,go,Go,我正试图通过为http go代码创建一个新的包来将它们分离为“控制器”,但不知道如何将db类型传递到处理程序中。我希望能够将在main.go中创建的Db类型传递到Index.go中的索引处理程序中。如果这是解决问题的错误方法,请让我知道一个更好的方法(我边学边做,现在希望保持简单)。到目前为止,我的代码是: main.go: package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/m

我正试图通过为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)
}
package c

import (
    "fmt"
    "net/http"
)

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

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

}
/app/c/index.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)
}
package c

import (
    "fmt"
    "net/http"
)

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

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

}
谢谢

使用闭包

应用程序内/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值。

工作正常。谢谢