猿问

复合文字使用非键控字段

我正在为 golang 使用新的官方 mongodb 驱动程序。我创建了一个复杂的查询来将数据插入 mongo db,然后根据元素值对其进行排序。我正在使用一个过滤器,我在其中创建了 bson 类型:-

filter := bson.D{{"autorefid", "100"}}

但它显示警告说:

primitive.E 复合字面量使用非键控字段

这些警告在我的代码中造成了混乱。


大话西游666
浏览 170回答 5
5回答

繁星淼淼

可以通过将检查标志设置为 false 来停止警告。$ go doc cmd/vet默认情况下执行所有检查。如果任何标志显式设置为 true,则仅运行那些测试。相反,如果任何标志明确设置为 false,则仅禁用那些测试。因此 -printf=true 运行 printf 检查,-printf=false 运行除 printf 检查之外的所有检查。Unkeyed composite literalsFlag: -compositesComposite struct literals that do not use the field-keyed syntax.但是警告是由于在primitive.E结构中设置值时没有提供键名。为primitive.E结构设置键将删除警告消息。例如filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}包原语包含类似于 Go 原语的类型,因为 BSON 类型不能有直接的 Go 原语表示。type E struct {    Key   string    Value interface{}}E 表示 D 的 BSON 元素。它通常在 D 内部使用。

跃然一笑

由于没有其他人指出这一点——警告是为了保护您免受第三方 API 的更改悄无声息地破坏您的代码。忽略此警告有可能导致非常讨厌且难以追踪运行时错误,因此如果您始终明确指定 3rd party 的键,vet您会更好。structstruct如果您正在使用的库的维护者出于某种原因决定更改其元素的顺序,就会出现这种情况。例如,在 OP 的情况下Key用, 切换。Value您的代码似乎仍然可以正常编译,但是您打算作为键的内容现在将作为值传递,反之亦然,并且事情会以意想不到的方式开始中断。

胡子哥哥

您可以简单地更改:filter := bson.D{{"autorefid", "100"}}到:filter := bson.D{{Key: "autorefid", Value: "100"}}//跳过 primitive.E 正如 Chris W 所说

泛舟湖上清波郎朗

你可以改变:filter := bson.D{{"autorefid", "100"}}到:filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}

温温酱

实际上,如果不需要 BSON 文档的有序表示,您可以通过简单地更改将 BSON 文档更改为无序表示filter := bson.D{{"autorefid", "100"}}到filter := bson.M{"autorefid": "100"}MongoDB 服务器足够聪明,可以找到匹配的索引,而不管使用的顺序如何。bson.Dbson.M
随时随地看视频慕课网APP

相关分类

Go
我要回答