1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
redis.Client是一種結(jié)構(gòu)類(lèi)型,并且在 Go 中結(jié)構(gòu)類(lèi)型根本不可模擬。然而 Go 中的接口是可模擬的,所以你可以做的是定義你自己的“newredisclient”函數(shù),而不是返回一個(gè)結(jié)構(gòu),而是返回一個(gè)接口。由于 Go 中的接口是隱式滿(mǎn)足的,因此您可以定義接口,以便它可以由 redis.Client 開(kāi)箱即用地實(shí)現(xiàn)。
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
}
現(xiàn)在*redis.Client不再滿(mǎn)足接口RedisClient,因?yàn)?的返回類(lèi)型Ping()不同。redis.Client.Ping()請(qǐng)注意, 的結(jié)果類(lèi)型是否滿(mǎn)足 的返回接口類(lèi)型并不重要RedisClient.Ping(),重要的是方法簽名不同,因此它們的類(lèi)型不同。
要解決此問(wèn)題,您可以定義一個(gè)*redis.Client直接使用并滿(mǎn)足新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 關(guān)注
- 123 瀏覽
添加回答
舉報(bào)