如何将接口实现指针转换为接口指针?
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
是接口类型,它已经是指针,你没有处理任何数据。
我有一个接口:
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
是接口类型,它已经是指针,你没有处理任何数据。