复合文字使用无键字段

Posted

技术标签:

【中文标题】复合文字使用无键字段【英文标题】:Composite literal uses unkeyed fields 【发布时间】:2019-06-30 02:24:17 【问题描述】:

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

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

但它显示警告说:

primitive.E

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

【问题讨论】:

这段代码看起来不错。也许错误在另一行? @SergioTulentsev 没有错误,这是go vet 显示的警告 对了。感谢您发布自我回答,今天学到了一些东西:) 禁用vs代码中的警告,ctrl+,搜索go.vetflags添加项目-composites=false 【参考方案1】:

可以通过将检查标志设置为 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 struct 中设置值时未提供键名。

primitive.E 结构设置键将删除警告消息。例如

filter := bson.Dprimitive.EKey: "autorefid", Value: "100"

包原语包含类似于 BSON 的 Go 原语的类型 类型不能有直接的 Go 原始表示。

type E struct 
    Key   string
    Value interface

E 代表 D 的 BSON 元素。通常在 D 内部使用。

欲了解更多信息,请查看primitive.E

【讨论】:

当我们提供钥匙时,我看到它更干净了 filter := bson.DKey: "autorefid", Value: "100" // 跳过 primitive.E 也可以。 所以如果我们将它放在变量e := functionWhichReturnsE(...) 中并且我们需要bson.D 我们需要做bd := bson.DKey: e.Key, Value: e.Value 吗?看起来不错,直到你为template.Template 做这件事。最好禁用它smh 我想我会在我的utils 包中添加类似func E(s string, i interface) bson.E return bson.E Key: s, Value: i, 的内容:S【参考方案2】:

由于没有其他人指出这一点 - 警告是为了保护您免受第三方 API 的更改以静默方式破坏您的代码。

忽略此vet 警告可能会导致非常讨厌且难以追踪运行时错误,因此最好始终指定第三方的密钥structs明确

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

【讨论】:

这解释了为什么它只警告来自其他包的结构。这不会警告来自同一代码包的结构。【参考方案3】:

你可以改变:

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

到:

filter := bson.Dprimitive.EKey: "autorefid", Value: "100"

【讨论】:

【参考方案4】:

你可以简单地改变:

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

到:

filter := bson.DKey: "autorefid", Value: "100"

//Chris W所说的跳过primitive.E

【讨论】:

【参考方案5】:

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

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

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

有关bson.Dbson.M 的更多详细信息,请参阅this *** 答案。 MongoDB 服务器足够智能,无论使用的顺序如何,都能找到匹配的索引。

【讨论】:

【参考方案6】:

如果您使用的是 vscode,请尝试在设置中禁用以下内容:

【讨论】:

以上是关于复合文字使用无键字段的主要内容,如果未能解决你的问题,请参考以下文章

Qt 2D绘图之三:绘制文字路径图像复合模式

如何使用复合文字来“fprintf()”具有任意基数的多个格式化数字?

使用 GNU C++ 的复合文字(也许是 UB?)初始化结构的奇怪现象

复合文字(Compound Literals)

如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器

复合组件和 PanelGrid 的布局问题 [重复]