【问题标题】:How to cast interface implementation pointer to interface pointer?如何将接口实现指针转换为接口指针?
【发布时间】:2018-06-16 13:44:10
【问题描述】:

我有一个界面:

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))
}

但我有一个错误:

不能使用 db (type *store.DB) as type *store.Datastore in field value: *store.Datastore 是指向接口的指针,而不是接口

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

type Env struct {
    db store.Datastore
}

但我不想复制数据。

【问题讨论】:

标签: pointers go casting type-conversion duck-typing


【解决方案1】:

使用

type Env struct {
    db store.Datastore
}

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 2014-08-16
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 2015-07-21
  • 2014-10-13
  • 1970-01-01
相关资源
最近更新 更多