【发布时间】:2018-09-03 01:46:55
【问题描述】:
我在玩一些 Gorilla/Mux 和 Go-Redis 时试图弄脏我的手,但我在这里遇到了一点实现问题。
基本上我有一个结构如下的项目:
redismanager.go 处理 Redis 客户端的初始化:
package redismanager
import (
"fmt"
"github.com/go-redis/redis"
)
func InitRedisClient() redis.Client {
client := redis.NewClient(&redis.Options{
Addr : "localhost:6379",
Password: "",
DB : 0, //default
})
pong, err := client.Ping().Result()
if( err != nil ){
fmt.Println("Cannot Initialize Redis Client ", err)
}
fmt.Println("Redis Client Successfully Initialized . . .", pong)
return *client
}
main.go 调用redismanager.InitRedisClient 并初始化mux.Handlers:
package main
import (
"github.com/gorilla/mux"
"github.com/go-redis/redis"
"net/http"
"fmt"
"log"
"encoding/json"
"io/ioutil"
"../redismanager"
"../api"
)
type RedisInstance struct {
RInstance *redis.Client
}
func main() {
//Initialize Redis Client
client := redismanager.InitRedisClient()
//Get current redis instance to get passed to different Gorilla-Mux Handlers
redisHandler := &RedisInstance{RInstance:&client}
//Initialize Router Handlers
r := mux.NewRouter()
r.HandleFunc("/todo", redisHandler.AddTodoHandler).
Methods("POST")
fmt.Println("Listening on port :8000 . . .")
// Bind to a port and pass our router in
log.Fatal(http.ListenAndServe(":8000", r))
}
现在,我可以在同一个文件中轻松定义 AddTodoHandler 并使其正常工作,例如:
func (c *RedisInstance) AddTodoHandler(w http.ResponseWriter, r *http.Request) {
. . . doSomething
}
但是,为了使事情更加模块化,我试图将所有这些 RouteHandlers 移动到 api 包中它们各自的文件中。为了做到这一点,我需要传递对 redisHandler 的引用,但是在尝试使用 api 包中的 Handler 进行此操作时遇到了一些困难。
例如,如果我在主目录中添加:
r.HandleFunc("/todo/{id}", api.GetTodoHandler(&client)).
Methods("GET")
使用 gettodo.go
package api
import (
"net/http"
"github.com/gorilla/mux"
"fmt"
"encoding/json"
"github.com/go-redis/redis"
)
func GetTodoHandler(c *RedisInstance) func (w http.ResponseWriter, r *http.Request) {
func (w http.ResponseWriter, r *http.Request) {
. . . doSomething
}
}
效果很好。
我对 Go 还是很陌生,即使经过多次研究和阅读,也没有找到任何更清洁的解决方案。
我的方法正确还是有更好的方法?
【问题讨论】:
-
我建议使用初始化 DB 和路由的 App 结构。并且所有的 Redis 方法都会在里面被调用。例如
type App struct{Routes *mux.Router, DB *sql.DB}并且将有App.initializeRoutes方法