0

嗯,我在处理接口时遇到了问题。

所以我使用 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

我对这个概念缺少什么?

4

1 回答 1

1

在 golang-nuts 上得到了这个答案的回复。

我遇到的问题是这些方法必须具有完全相同的签名: http: //golang.org/doc/faq#t_and_equal_interface

感谢 golang-nuts 小组的 Jesse McNelis!

于 2013-10-27T04:29:57.973 回答