如何将接口实现指针转换为接口指针?

How to cast interface implementation pointer to interface pointer?

我有一个接口:

type Datastore interface {
    InsertString(str string) error
}

我有此接口的 PostgreSql 实现:

type DB struct {
    session *sql.DB
}

 func (db *DB) InsertString(str string) error {
    return nil
}

func NewDB(user, password, dbName string) (*DB, error) {
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
        user, password, dbName)

    db, err := sql.Open("postgres", dbinfo)
    if err != nil {
        log.Println(err)
        return nil, err
    }

    err = db.Ping()
    if err != nil {
        log.Println("Cannot ping database")
        return nil, err
    }

    return &DB{db}, nil
}

现在我想获取存储并在我的 API 处理程序中使用它。

因此,我创建了环境结构并尝试使用它:

type Env struct {
    db *store.Datastore
}

func (env *Env) HealthCheckHandler(w http.ResponseWriter, r *http.Request) {
    // A very simple health check.
}

func main() {
    log.Println("Server staring...")

    db, _ := store.NewDB(USER, PASSWORD, DB_NAME)

    env := Env {
        db: db,
    }

    r := mux.NewRouter()
    r.HandleFunc("/health", env.HealthCheckHandler)

    log.Fatal(http.ListenAndServe("localhost:"+PORT, r))
}

但是我有一个错误:

cannot use db (type *store.DB) as type *store.Datastore in field value: *store.Datastore is pointer to interface, not interface

我知道,如何解决这个问题。我可以使用这个结构而不是初始结构:

type Env struct {
    db store.Datastore
}

但是我不想复制数据。

正在使用

type Env struct {
    db store.Datastore
}

是正确的解决方案。因为 store.Datastore 是接口类型,它已经是指针,你没有处理任何数据。