嗯,我在处理接口时遇到了问题。
所以我使用 Go 包来处理我的 mongodb 东西,但我不想将该包导入到每个模型中,等等。我想将尽可能多的子包(如模型)保留在标准库中。所以我想我会像这样布置一些接口:
type m map[string]interface{}
type collectionSlice interface {
One(interface{}) error
}
type collection interface {
Upsert(interface{}, interface{}) (interface{}, error)
Find(interface{}) collectionSlice
}
type database interface {
C(string) collection
}
问题是,当我去使用这样的功能时:
func FindItem(defindex int, d database) (*Item, error) {
通过传入我的 mgo.Database 在使用接口的包中找到:
item, err := dota.FindItem(int(defindex), ctx.Database)
我得到一个编译器错误:
controllers/handlers.go:35: 不能在函数参数中使用 ctx.Database (type *mgo.Database) 作为类型 dota.database: *mgo.Database 没有实现 dota.database (C 方法的错误类型) 有 C(string ) *mgo.Collection 想要 C(string) dota.collection
我对这个概念缺少什么?