Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 如何将接口实现指针转换为接口指针?_Pointers_Go_Casting_Type Conversion_Duck Typing - Fatal编程技术网

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

Pointers 如何将接口实现指针转换为接口指针?,pointers,go,casting,type-conversion,duck-typing,Pointers,Go,Casting,Type Conversion,Duck Typing,我有一个界面: type Datastore interface { InsertString(str string) error } type DB struct { session *sql.DB } func (db *DB) InsertString(str string) error { return nil } func NewDB(user, password, dbName string) (*DB, error) { dbinfo :=

我有一个界面:

type Datastore interface {
    InsertString(str string) error
}
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
}
我有此接口的PostgreSql实现:

type Datastore interface {
    InsertString(str string) error
}
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)用作字段中的type*store.Datastore 值:*store.Datastore是指向接口的指针,而不是接口

我知道,怎么解决这个问题。我可以使用此结构而不是首字母:

type Env struct {
    db store.Datastore
}
但我不想复制数据

使用

type Env struct {
    db store.Datastore
}
这是正确的解决方案。因为
store.Datastore
是接口类型,所以它已经是指针,您不需要处理任何数据。

使用

type Env struct {
    db store.Datastore
}

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

db*store.Datastore
-store.Datastore是一个接口,所以删除指针符号*,您不需要它-接口可以接受值和指针,
db*store.Datastore
-store.Datastore是一个接口,所以去掉指针符号*,你不需要它-接口可以接受值和指针,哦,我不知道。似乎是这样。这不是显而易见的事情。我已经读过了。非常感谢。哦,我不知道。似乎是这样。这不是显而易见的事情。我已经读过了。非常感谢。