resource panther golang gene framework enrichment biological go gorilla

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