复合文字使用非键控字段

新手上路,请多包涵

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

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

但它显示警告说:

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

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

原文由 Himanshu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 486
2 个回答

可以通过将检查标志设置为 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 内部使用。

有关更多信息,请查看 primitive.E

原文由 Himanshu 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

忽略这个 vet 警告有可能导致真正令人讨厌且难以追踪的运行时错误,所以如果你 总是指定第三方的密钥,你会更好 struct -s 明确 ---

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

原文由 antichris 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题