为了账号安全,请及时绑定邮箱和手机立即绑定

复合文字使用非键控字段

复合文字使用非键控字段

Go
大话西游666 2023-06-05 17:24:36
我正在为 golang 使用新的官方 mongodb 驱动程序。我创建了一个复杂的查询来将数据插入 mongo db,然后根据元素值对其进行排序。我正在使用一个过滤器,我在其中创建了 bson 类型:-filter := bson.D{{"autorefid", "100"}}但它显示警告说:primitive.E 复合字面量使用非键控字段这些警告在我的代码中造成了混乱。
查看完整描述

5 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

可以通过将检查标志设置为 false 来停止警告。


$ go doc cmd/vet

默认情况下执行所有检查。如果任何标志显式设置为 true,则仅运行那些测试。相反,如果任何标志明确设置为 false,则仅禁用那些测试。因此 -printf=true 运行 printf 检查,-printf=false 运行除 printf 检查之外的所有检查。


Unkeyed composite literals


Flag: -composites


Composite 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 内部使用。


查看完整回答
反对 回复 2023-06-05
?
跃然一笑

TA贡献1826条经验 获得超6个赞

由于没有其他人指出这一点——警告是为了保护您免受第三方 API 的更改悄无声息地破坏您的代码。

忽略此警告有可能导致非常讨厌且难以追踪运行时错误,因此如果您始终明确指定 3rd party 的键,vet您会更好。struct

struct如果您正在使用的库的维护者出于某种原因决定更改其元素的顺序,就会出现这种情况。例如,在 OP 的情况下Key用, 切换。Value您的代码似乎仍然可以正常编译,但是您打算作为键的内容现在将作为值传递,反之亦然,并且事情会以意想不到的方式开始中断。


查看完整回答
反对 回复 2023-06-05
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可以简单地更改:

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

到:

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

//跳过 primitive.E 正如 Chris W 所说


查看完整回答
反对 回复 2023-06-05
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

你可以改变:

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

到:

filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}


查看完整回答
反对 回复 2023-06-05
?
温温酱

TA贡献1752条经验 获得超4个赞

实际上,如果不需要 BSON 文档的有序表示,您可以通过简单地更改将 BSON 文档更改为无序表示

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

filter := bson.M{"autorefid": "100"}

MongoDB 服务器足够聪明,可以找到匹配的索引,而不管使用的顺序如何。bson.Dbson.M


查看完整回答
反对 回复 2023-06-05
  • 5 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信