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是一个接口,所以去掉指针符号*,你不需要它-接口可以接受值和指针,哦,我不知道。似乎是这样。这不是显而易见的事情。我已经读过了。非常感谢。哦,我不知道。似乎是这样。这不是显而易见的事情。我已经读过了。非常感谢。