我正在尝试在 Go 中做一个基本的 TODO 列表应用程序。我正在从 mongodb atlas 在我的集群上创建 CRUD 操作。但我在解码 BSON 对象时遇到问题。对于我的模型,我使用了一个未导入的结构,但它实现了一个在 repo 中使用的接口。尝试从数据库中读取时出现此错误:恐慌:没有找到接口的解码器。IToDoItem我知道我应该以某种方式为我的接口实现一个解码器,但是如果不从模型中导出我的主结构,我就无法实现它。这也意味着我在模型中没有隐私,并且可以在程序周围的任何模式下访问模型中的项目,我认为这是错误的。这是我的代码:模型.gotype 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{}}现在它没有返回任何东西,因为我想在回购级别解决问题。
1 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
接口不是具体类型,可能有多个(任意数量)类型实现它。驱动程序理所当然地不知道如何实例化它。
的字段toDoItem
被导出,没有理由使toDoItem
自己未导出。只需将其导出并使用[]ToDoItem
(或[]*ToDoItem
)的一部分,您的所有问题都会消失。
另请注意,有一种Cursor.All()
方法可以获取所有结果,因此您不必遍历文档并Cursor.Decode()
为每个文档调用。
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报
0/150
提交
取消