我正在使用新的官方mongodb驱动程序开发golang。我创建了一个复杂的查询,将数据插入到mongo db中,然后根据一个元素值对其进行排序。我正在使用过滤器,在其中使用bson类型创建:
filter := bson.D{{"autorefid", "100"}}
但是它显示了一个警告:
primitive.E 组合字面量使用未键控字段
这些警告在我的代码中制造了一团糟。
通过将检查标志设置为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"}}
primitive 包含了一些与 Go 原始类型类似的类型,用于表示在 BSON 中没有直接对应的 Go 原始类型。
type E struct {
Key string
Value interface{}
}
E代表D的BSON元素。通常在D内使用。
更多信息请参见primitive.E
primitive.E
也可以工作。 - Chris We := functionWhichReturnsE(...)
中,并且我们需要一个bson.D
,我们需要执行bd := bson.D{Key: e.Key, Value: e.Value}
?看起来不错,直到你对template.Template
这样做。最好禁用它。 - Phani Rithvijutils
包中添加类似于 func E(s string, i interface{}) bson.E { return bson.E{ Key: s, Value: i, } }
的东西 :S - Cirelli94鉴于没有其他人指出这一点,这个警告是为了保护您免受第三方API更改而导致的代码静默破坏。
忽略此vet
警告可能会导致非常严重且难以跟踪的运行时错误,因此最好始终明确指定第三方struct
的键。
如果您使用的库的维护者决定由于任何原因更改其struct
中的元素顺序,就会发生这种情况。例如,在OP案例中将Key
与Value
交换。您的代码仍然可以正常编译,但您想要的键现在将作为值传递,反之亦然,并且事情只会以意想不到的方式开始崩溃。
您可以简单地更改:
filter := bson.D{{"autorefid", "100"}}
致:
filter := bson.D{{Key: "autorefid", Value: "100"}}
//根据Chris W所说,跳过primitive.E
您可以更改:
filter := bson.D{{"autorefid", "100"}}
至:
filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
实际上,如果一个BSON文档的有序表示形式并非必需,您可以通过简单更改将其转换为无序表示形式。
filter := bson.D{{"autorefid", "100"}}
到
filter := bson.M{"autorefid": "100"}
请查看这篇stackoverflow答案,了解有关bson.D
与bson.M
的更多细节。 MongoDB服务器足够聪明,可以找到匹配的索引,无论使用的顺序如何。
go vet
正在显示的警告。 - HimanshuCtrl+,
搜索go.vetflags
并添加-composites=false
。 - PeterM