我试图将我的数据库对象传递给我的处理程序,而不是拥有一个全局对象。但我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它需要关闭作为第二个参数。
// https://github.com/gorilla/mux/blob/master/mux.go#L174
// HandleFunc registers a new route with a matcher for the URL path.
// See Route.Path() and Route.HandlerFunc().
func (r *Router) HandleFunc(path string, f func(http.ResponseWriter,
*http.Request)) *Route {
return r.NewRoute().Path(path).HandlerFunc(f)
}
然后定义了我可以使用的参数,理想情况下我希望有这样的第三个参数。
// In my main
router.HandleFunc("/users/{id}", showUserHandler).Methods("GET")
func showUserHandler(w http.ResponseWriter, r *http.Request, db *gorm.DB) {
fmt.Fprintf(w, "We should fetch the user with id %s", vars["id"])
}
有解决方法吗?或者我需要一个全局数据库对象?我是Go的新手,所以请详细解释一个可能的答案。
答案 0 :(得分:48)
欢迎来到。
拥有全局变量和特别是数据库对象是可以接受的。
但是,如果你不愿意,有几种方法可以解决,例如你可以创建一个结构并在其上定义showHandler
。
type Users struct {
db *gorm.DB
}
func (users *Users) showHandler(w http.ResponseWriter, r *http.Request) {
//now you can use users.db
}
func (users *Users) addHandler(w http.ResponseWriter, r *http.Request) {
//now you can use users.db
}
// setup
users := &Users{db: createDB()}
router.HandleFunc("/users/{id}", users.showHandler).Methods("GET")
router.HandleFunc("/users/new", users.addHandler)
//etc
另一种方法是创建包装函数:
db := createDB()
router.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
showUserHandler(w, r, db)
}).Method("GET")