复合文字使用无键字段
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
警告可能会导致非常讨厌且难以追踪运行时错误,因此最好始终指定第三方的密钥struct
s明确。
如果您使用的库的维护者出于某种原因决定更改其struct
中元素的顺序,就会出现这种情况。例如,在 OP 情况下,将 Key
与 Value
切换。您的代码似乎仍然可以正常编译,但是您打算成为键的内容现在将作为值传递,反之亦然,事情会以意想不到的方式开始。
【讨论】:
这解释了为什么它只警告来自其他包的结构。这不会警告来自同一代码包的结构。【参考方案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.D
与bson.M
的更多详细信息,请参阅this *** 答案。 MongoDB 服务器足够智能,无论使用的顺序如何,都能找到匹配的索引。
【讨论】:
【参考方案6】:如果您使用的是 vscode,请尝试在设置中禁用以下内容:
【讨论】:
以上是关于复合文字使用无键字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用复合文字来“fprintf()”具有任意基数的多个格式化数字?
使用 GNU C++ 的复合文字(也许是 UB?)初始化结构的奇怪现象