【发布时间】: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
}
但我不想复制数据。
【问题讨论】:
-
db *store.Datastore- store.Datastore 是一个接口,所以去掉指针符号 *,你不需要它 - 接口可以接受值和指针,medium.com/@saiyerram/go-interfaces-pointers-4d1d98d5c9c6
标签: pointers go casting type-conversion duck-typing