指向变量的指针不能用作指向接口的指针

Pointer to a variable cannot be used as a pointer to an interface

提问人:Ran Yanay 提问时间:11/15/2023 最后编辑:kostixRan Yanay 更新时间:11/15/2023 访问量:69

问:

我正在用 Go 编写一个与 Redis 通信的模块。 为了编写单元测试,我希望能够将模拟的 redis 注入到模块中。 在生产中,我想将真正的Redis发送到模块ctor。 在单元测试中,我想将模拟的 Redis 发送到模块 ctor。

这就是我尝试这样做的方式:

package redis

import "time"

type IStore interface {
    Get(key string) (string, error)
    MGet(keys []string) ([]interface{}, error)
    Set(key string, val interface{}, expiration time.Duration) error
    MSet(values map[string]string) error
    Delete(keys []string) error
    DeleteByPrefix(prefix string) error
    Keys(prefix string) ([]string, error)
}

package redis

import (
    "context"
    "github.com/go-redis/redis/v8"
    "time"
)

type Store struct {
    prefix        string
    clusterClient *redis.ClusterClient
    client        *redis.Client
}

func New(prefix string) *Store {
.
.
.
.
package redis

import (
    "errors"
    "strings"
    "time"
)

type StoreMock struct {
    Prefix string
    Client map[string]interface{}
}

func NewStoreMock(prefix string) *StoreMock {
.
.
.

所以我有实现此接口的 store 和 StoreMock。

我的MW代码的那部分:

type Middleware struct {
    redis            *redis.IStore
}

type MiddlewareOptions struct {
    Redis            *redis.IStore
}

func InitMiddleware(options rMiddlewareOptions) *Middleware {

    return &FreeTierMiddleware{
        redis:            options.Redis,
    }
}

从主要 IM 尝试这样做:

    redis22 := redis.New("")
    options := middlewares.MiddlewareOptions{
        Redis: redis22,
    }
    mww := middlewares.InitMiddleware(options)

但我得到:Cannot use 'redis22' (type *Store) as the type *redis.IStore

我做错了什么?

字段保持接口,并使用其中一个实现设置字段

Go 接口

评论

3赞 Sarath Sadasivan Pillai 11/15/2023
如果 Istore 是接口,则使用redis.IStore*redis.IStore
3赞 kostix 11/15/2023
go.dev/doc/faq#pointer_to_interface
2赞 kostix 11/15/2023
你似乎对 Go 中的界面保持着错误的思维模式;它们与其他流行的PL(如C++)非常不同。我建议阅读这篇经典作品,它很老,但仍然 99% 正确(模,接口类型的变量可以存储原始类型的值,例如直接存储;这不再是真的)。int
2赞 kostix 11/15/2023
另外,如果 Russ Cox 的作品让人感到不知所措,也许可以从“Effective Go”的相关部分开始。
1赞 Ferdy 11/15/2023
您正在请求指向接口的指针。您需要接口的实现。松开 .*redis.IStore*

答: 暂无答案