我如何将参数传递给我的处理程序 [英] How do I pass arguments to my handler

查看:99
本文介绍了我如何将参数传递给我的处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将我的数据库对象传递给我的处理程序,而不是拥有全局对象。但我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它将一个闭包作为第二个参数。

  // https://github.com/gorilla/mux/blob/master/mux.go#L174 
// HandleFunc通过一个匹配器注册一个新的路由以获得URL路径。
//请参阅Route.Path()和Route.HandlerFunc()。
func(r * Router)HandleFunc(path string,f func(http.ResponseWriter,
* http.Request))* Route {
return r.NewRoute()。Path(path) .HandlerFunc(f)
}

然后定义我可以使用的参数,理想情况下为i

  //在我的主
router.HandleFunc(/ users / {id},showUserHandler)。方法(GET)

func showUserHandler(w http.ResponseWriter,r * http.Request,db * gorm.DB){
fmt。 Fprintf(w,我们应该获取id为%s的用户,vars [id])
}

是否有解决方法?或者我需要一个全局数据库对象?我是Go的新手,所以请详细解释一个潜在的答案。

欢迎使用Go。


$ b

具有全局变量和特殊数据库对象是可以接受的。



然而,解决方法很少,如果您不想,例如你可以创建一个结构并在其上定义你的 showHandler

 <$ c $ (用户*用户)showHandler(w http.ResponseWriter,r * http.Request){
//现在你可以使用users.db

func(users * Users)addHandler(w http.ResponseWriter,r * http.Request){
//现在你可以使用users.db
}

// setup
users:=& Users {db:createDB()}
router.HandleFunc(/ users / {id },users.showHandler)。方法(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)
})。方法(GET)


I am trying to pass my database object along to my handlers, instead of having a global object. But I don't know if this is possible, I'm using Gorilla Mux package, and I can see that it takes a closure as a second param.

// 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)
}

Which then defines the params i can use, ideally i would like to have a third param like this.

// 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"])
}

Is there a workaround? Or do I need a global db object? I am new to Go, so please explain a potential answer in detail.

解决方案

Welcome to Go.

It is acceptable to have global variables and specially database objects.

However, there are few ways to workaround that if you prefer not to, for example you can create a struct and define your showHandler on it.

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

Another approach is creating a wrapper function:

db := createDB()
router.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
    showUserHandler(w, r, db)
}).Method("GET")

这篇关于我如何将参数传递给我的处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆