猿问

在 BSON 中解码,这是一个由私有结构实现的接口

我正在尝试在 Go 中做一个基本的 TODO 列表应用程序。我正在从 mongodb atlas 在我的集群上创建 CRUD 操作。但我在解码 BSON 对象时遇到问题。对于我的模型,我使用了一个未导入的结构,但它实现了一个在 repo 中使用的接口。尝试从数据库中读取时出现此错误:


恐慌:没有找到接口的解码器。IToDoItem


我知道我应该以某种方式为我的接口实现一个解码器,但是如果不从模型中导出我的主结构,我就无法实现它。这也意味着我在模型中没有隐私,并且可以在程序周围的任何模式下访问模型中的项目,我认为这是错误的。


这是我的代码:


模型.go


type toDoItem struct{

    ItemId      int             `bson:"itemId,omitempty"`

    Title       string          `bson:"title,omitempty"`

    Description string          `bson:"description,omitempty"`

}


func New(itemId int,title string,description string) interfaces.IToDoItem {

    return toDoItem{

        ItemId:      itemId,

        Title:       title,

        Description: description,

    }

}


func (item toDoItem)GetItemId()int{

    return item.ItemId

}


func (item toDoItem)GetTitle()string{

    return item.Title

}


func (item toDoItem)GetDescription()string{

    return item.Description

}

界面


type IToDoItem interface {

    GetItemId() int

    GetTitle() string

    GetDescription() string

}

回购功能


func (r *Repository)GetAll() []interfaces.IToDoItem{

    cursor, err := r.collection.Find(context.TODO(), bson.D{})

    if err != nil{

        panic(err)

    }

    defer cursor.Close(context.Background())


    var allItems []interfaces.IToDoItem


    for cursor.Next(context.Background()){

        var result interfaces.IToDoItem

        err := cursor.Decode(&result)

        if err!= nil{

            panic(err)

        }

        allItems = append(allItems[:],result)

    }

    fmt.Println(allItems)

    return []interfaces.IToDoItem{}

}

现在它没有返回任何东西,因为我想在回购级别解决问题。


慕村9548890
浏览 141回答 1
1回答

炎炎设计

接口不是具体类型,可能有多个(任意数量)类型实现它。驱动程序理所当然地不知道如何实例化它。的字段toDoItem被导出,没有理由使toDoItem自己未导出。只需将其导出并使用[]ToDoItem(或[]*ToDoItem)的一部分,您的所有问题都会消失。另请注意,有一种Cursor.All()方法可以获取所有结果,因此您不必遍历文档并Cursor.Decode()为每个文档调用。
随时随地看视频慕课网APP

相关分类

Go
我要回答