可以通过将检查标志设置为 false 来停止警告。$ go doc cmd/vet默认情况下执行所有检查。如果任何标志显式设置为 true,则仅运行那些测试。相反,如果任何标志明确设置为 false,则仅禁用那些测试。因此 -printf=true 运行 printf 检查,-printf=false 运行除 printf 检查之外的所有检查。Unkeyed composite literalsFlag: -compositesComposite 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 内部使用。
由于没有其他人指出这一点——警告是为了保护您免受第三方 API 的更改悄无声息地破坏您的代码。忽略此警告有可能导致非常讨厌且难以追踪运行时错误,因此如果您始终明确指定 3rd party 的键,vet您会更好。structstruct如果您正在使用的库的维护者出于某种原因决定更改其元素的顺序,就会出现这种情况。例如,在 OP 的情况下Key用, 切换。Value您的代码似乎仍然可以正常编译,但是您打算作为键的内容现在将作为值传递,反之亦然,并且事情会以意想不到的方式开始中断。
您可以简单地更改:filter := bson.D{{"autorefid", "100"}}到:filter := bson.D{{Key: "autorefid", Value: "100"}}//跳过 primitive.E 正如 Chris W 所说