代码之家  ›  专栏  ›  技术社区  ›  Himanshu

复合文字使用无眼字段

  •  0
  • Himanshu  · 技术社区  · 7 年前

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

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

    primitive.E复合文字使用无眼字段

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

    1 回复  |  直到 7 年前
        1
  •  75
  •   Scott Stensland    6 年前

    通过将check标志设置为false,可以停止警告。

    $ go doc cmd/vet
    

    如果显式设置为false,则仅禁用这些测试。因此

    Unkeyed composite literals
    
    Flag: -composites
    
    Composite struct literals that do not use the field-keyed syntax.
    

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

    设置 原始的 结构将删除警告消息。例如

    filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
    

    类型不能具有直接Go基元表示形式。

    type E struct {
        Key   string
        Value interface{}
    }
    

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

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

        2
  •  21
  •   antichris    5 年前

    因为没有其他人指出这一点,所以警告是为了保护您不受第三方API更改的影响,使您的代码不会被破坏。

    vet 警告有可能导致非常讨厌的和难以追踪的运行时错误,所以如果你这样做,你会更好 始终指定第三方的密钥 struct .

    如果您正在使用的库的维护人员决定更改其库中元素的顺序,则会出现这种情况 结构 Key 具有 Value ,在OP案例中。您的代码看起来仍然可以很好地编译,但是您希望成为键的内容现在将作为值传递,反之亦然,并且事情将以意外的方式开始破坏。

        3
  •  20
  •   dbam    6 年前

    您可以更改:

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

    致:

    filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
    
        4
  •  17
  •   dilungasr    6 年前

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

    致:

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

        5
  •  7
  •   Mekel Ilyasa    5 年前

    事实上,如果 通过简单的改变来表达

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

    filter := bson.M{"autorefid": "100"}
    

    this bson.D vs bson.M . MongoDB服务器足够智能,可以在不考虑使用顺序的情况下找到匹配的索引。