如何向我的处理程序传递参数?

huangapple go评论68阅读模式
英文:

How do I pass arguments to my handler

问题

我正在尝试将我的数据库对象传递给处理程序,而不是使用全局对象。但我不知道是否可能,我正在使用Gorilla Mux包,我可以看到它将闭包作为第二个参数。

在这种情况下,它定义了我可以使用的参数,理想情况下,我想要有一个像这样的第三个参数。

在我的主函数中:

router.HandleFunc("/users/{id}", showUserHandler).Methods("GET")

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

有没有解决方法?或者我需要一个全局的db对象吗?我是Go的新手,请详细解释可能的答案。

英文:

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.

答案1

得分: 135

欢迎使用Go。

在Go中,使用全局变量和特殊的数据库对象是可以接受的。

然而,如果你不喜欢这种方式,有几种方法可以解决,例如你可以创建一个结构体,并在其中定义你的showHandler

type Users struct {
    db *gorm.DB
}

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

// 设置
users := &Users{db: createDB()}
router.HandleFunc("/users/{id}", users.showHandler).Methods("GET")
router.HandleFunc("/users/new", users.addHandler)
// 等等

另一种方法是创建一个包装函数:

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

希望这些解决方案对你有帮助!

英文:

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")

huangapple
  • 本文由 发表于 2014年10月6日 15:53:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/26211954.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定