我试图通过为它们创建一个新包来将我的 http go 代码分成“控制器”,但无法弄清楚如何将 db 类型传递到处理程序中。我希望能够将我在 main.go 中创建的 Db 类型传递到我在 index.go 中的索引处理程序中。如果这是解决此问题的错误方法,请告诉我更好的方法(我正在学习,现在希望保持简单)。到目前为止我的代码:main.go:package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" "log" "mvc3/app/c" "net/http")var Db *sql.DBfunc 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 cimport ( "fmt" "net/http")func Index(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello world!")}谢谢!
1 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
使用闭包。
在 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 的值。
- 1 回答
- 0 关注
- 178 浏览
添加回答
举报
0/150
提交
取消