如何将参数传递给我的处理程序

问题描述:

我想将我的数据库对象传递给我的处理程序,而不是具有全局对象。但我不知道这是否可行,我使用的是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("https://*.com/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的新手,所以请详细解释一下可能的答案。

+2

http://*.com/a/26106655/6309可以给你一些想法了。 – VonC 2014-10-06 08:12:51

+0

@VonC我实际上尝试http://simonsdotnet.wordpress.com/2014/09/06/extending-gos-http-handlers/,但发现它没有与大猩猩一起工作,因为http包只是想要ServeHTTP,但大猩猩想要一个具有特定参数的函数。我可能是错的。 – MartinElvar 2014-10-06 08:18:28

欢迎使用Go。

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

但是,有几种方法可以解决这个问题,如果您不想这样做,例如您可以创建一个结构并在其上定义您的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("https://*.com/users/{id}", users.showHandler).Methods("GET") 
router.HandleFunc("https://*.com/users/new", users.addHandler) 
//etc 

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

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

谢谢OneOfOne。这个想法是,我想要更多的DI方法来做到这一点,也许我正在推翻它。你会说哪种解决方案最干净? – MartinElvar 2014-10-06 08:13:04

+0

@MartinElvar用于数据库连接,我想说一个全局变量很好。如果你想要特定的变量只能被一组特定的函数使用,那么就是struct解决方案。 – OneOfOne 2014-10-06 08:15:39

+0

@MartinElvar还记得,虽然大多数数据库处理程序对于并发是安全的,但其他一切都不是,所以如果你在一个处理程序中设置一个变量并将它放在另一个处理程序中,你将不得不使用某种锁定。 – OneOfOne 2014-10-06 08:16:46