复合文字使用无键字段

Him*_*shu 12 go mongodb

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

filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)

但它显示警告语:

原始E复合文字使用无键字段

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

Him*_*shu 25

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

$ go doc cmd/vet
Run Code Online (Sandbox Code Playgroud)

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

Unkeyed composite literals

Flag: -composites

Composite struct literals that do not use the field-keyed syntax.
Run Code Online (Sandbox Code Playgroud)

但是警告是由于在primitive.Estruct中设置值时未提供键名。

primitive.Estruct 设置键将删除警告消息。例如

filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)

包原语包含与BSON类型的Go原语相似的类型,不能具有直接Go原语表示形式。

type E struct {
    Key   string
    Value interface{}
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • filter := bson.D{{Key: "autorefid", Value: "100"}} // 跳过 `primitive.E` 也可以。 (4认同)

dba*_*bam 18

你可以改变:

filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)

到:

filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)


ant*_*ris 16

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

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

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

  • 这解释了为什么它只警告来自其他包的结构。这不会警告来自同一代码包的结构。 (3认同)

dil*_*asr 13

您可以简单地更改:

filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)

到:

filter := bson.D{{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)

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


Mek*_*asa 5

其实,如果订购一个BSON文档的表示并不一定,你可以你的BSON文档改变无序通过简单地改变表示

filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)

filter := bson.M{"autorefid": "100"}
Run Code Online (Sandbox Code Playgroud)

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