Пакет 'gopkg.in/redis.v3' содержит некоторый код
type Client struct {
}
func (*client) Eval (string, []string, []string) *Cmd {
}
type Cmd struct {
}
func (*Cmd) Result () (interface{}, error) {
}
, который успешно работает следующим образом
func myFunc (cli *redis.Client) {
result, err := cli.Eval('my script').Result()
}
Проблема в том, что иногда кластер Redisзабивается, имеет момент, и интерфейс, возвращаемый в результате, равен nil.
Это достаточно просто для обработки, но я хотел бы поставить тест на месте, который будет гарантировать, что он действительно обрабатывается и нет утверждения типавозникает паника.
Традиционно я вставляю фиктивный клиент Redis в myFunc, который в конечном итоге может вернуть nil.
type redisClient interface {
Eval(string, []string, []string) redisCmd
}
type redisCmd interface {
Result() (interface{}, error)
}
func myFunc (cli redisClient) {
result, err := cli.Eval('my script').Result()
}
Проблема, с которой я сталкиваюсь, заключается в том, что компилятор не распознает этот redis.Client.удовлетворяет интерфейсу redisClient, потому что он не распознает, что redis.Cmd, возвращенный из Eval, удовлетворяет redisCmd.
> cannot use client (type *redis.Client) as type redisClient in argument to myFunc:
> *redis.Client does not implement redisClient (wrong type for Eval method)
> have Eval(sting, []string, []string) *redis.Cmd
> want Eval(sting, []string, []string) redisCmd