我试图通过为它们创建一个新包来将我的 http go 代码分离到“ Controller ”中,但无法弄清楚如何将 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!")
}
谢谢!
最佳答案
使用闭包。
在 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/