1 回答
TA贡献1829条经验 获得超7个赞
redis.Client是一种结构类型,并且在 Go 中结构类型根本不可模拟。然而 Go 中的接口是可模拟的,所以你可以做的是定义你自己的“newredisclient”函数,而不是返回一个结构,而是返回一个接口。由于 Go 中的接口是隐式满足的,因此您可以定义接口,以便它可以由 redis.Client 开箱即用地实现。
type RedisClient interface {
Ping() redis.StatusCmd
// include any other methods that you need to use from redis
}
func NewRedisCliennt(options *redis.Options) RedisClient {
return redis.NewClient(options)
}
var newRedisClient = NewRedisClient
如果您还想模拟 的返回值Ping(),则需要做更多的工作。
// First define an interface that will replace the concrete redis.StatusCmd.
type RedisStatusCmd interface {
Result() (string, error)
// include any other methods that you need to use from redis.StatusCmd
}
// Have the client interface return the new RedisStatusCmd interface
// instead of the concrete redis.StatusCmd type.
type RedisClient interface {
Ping() RedisStatusCmd
// include any other methods that you need to use from redis.Client
}
现在*redis.Client不再满足接口RedisClient,因为 的返回类型Ping()不同。redis.Client.Ping()请注意, 的结果类型是否满足 的返回接口类型并不重要RedisClient.Ping(),重要的是方法签名不同,因此它们的类型不同。
要解决此问题,您可以定义一个*redis.Client直接使用并满足新RedisClient接口的瘦包装器。
type redisclient struct {
rc *redis.Client
}
func (c *redisclient) Ping() RedisStatusCmd {
return c.rc.Ping()
}
func NewRedisCliennt(options *redis.Options) RedisClient {
// here wrap the *redis.Client into *redisclient
return &redisclient{redis.NewClient(options)}
}
var newRedisClient = NewRedisClient
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报