我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是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的新手,所以请详细说明可能的答案。
欢迎来到。
可以使用全局变量,特别是数据库对象。
但是,有几种解决方法,如果您不愿意,例如,您可以创建一个结构并showHandler在其上定义您的结构。
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")