panther - ontology go
¿Cómo paso argumentos a mi manejador? (1)
Estoy tratando de pasar mi objeto de base de datos a mis manejadores, en lugar de tener un objeto global. Pero no sé si esto es posible, estoy usando el paquete Gorilla Mux, y puedo ver que toma un cierre como segundo parámetro.
// 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)
}
Lo que luego define los parámetros que puedo usar, idealmente me gustaría tener un tercer parámetro como este.
// 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"])
}
¿Hay una solución? ¿O necesito un objeto db global? Soy nuevo en Go, así que explique una posible respuesta en detalle.
Bienvenido a Go.
Es aceptable tener variables globales y especialmente objetos de base de datos.
Sin embargo, hay algunas formas de solucionar el problema si prefieres no hacerlo, por ejemplo, puedes crear una estructura y definir tu showHandler
en ella.
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
Otro enfoque es crear una función de envoltura:
db := createDB()
router.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
showUserHandler(w, r, db)
}).Method("GET")