首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当原始接口A是bson []接口时,如何将mongo-go驱动程序的输出反序列化为[]接口{}?

当原始接口A是bson []接口时,如何将mongo-go驱动程序的输出反序列化为[]接口{}?
EN

Stack Overflow用户
提问于 2019-04-26 15:12:01
回答 1查看 5.6K关注 0票数 5

我有一个映射接口{},它是从使用新的mongo -go驱动程序的mongo查询生成的。

我希望处理映射中的某些值,并替换属于聚合键的值中的£字符。

这是地图:

代码语言:javascript
复制
result2 = map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats]

在地图上循环:

代码语言:javascript
复制
    for key, value := range result2 {
        fmt.Println("key from result2:", key, " || ", "value from result 2:", value)
        if key == "aggregate" {
            fmt.Println("FOUND AGGREGATE || ", "value:", value, " || type: ", reflect.TypeOf(value))
        }
        if valueMSI, ok := value.([]interface{}); ok {
            fmt.Println("Working", valueMSI)
            fmt.Println(reflect.TypeOf(valueMSI))
        }
    }

现在,在检查聚合键的if语句中,第一个print语句的输出给出了如下类型:

代码语言:javascript
复制
primitive.A

但当打印时,它似乎是地图的[]接口{}?请参阅result2

考虑到这一点,为什么没有计算第二个if语句?

这是否意味着原始的.A !=接口数组?

在文档中,https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive类型A被定义为“A表示BSON数组。这种类型可以以简洁和可读的方式表示BSON数组。通常应该在序列化到BSON时使用它。对于反序列化,应该使用RawArray或数组类型。”

我该怎么做?我想访问聚合键的值吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-26 16:25:32

可以通过使用primitive.A (其形式为T(x) )的https://golang.org/ref/spec#Conversions将类型为T(x)的值转换为T(x)

所以在你的情况下,你可以这样做:

代码语言:javascript
复制
for key, value := range result2 {
    fmt.Println("key from result2:", key, " || ", "value from result 2:", value)
    if key == "aggregate" {
        fmt.Println("FOUND AGGREGATE || ", "value:", value, " || type: ", reflect.TypeOf(value))
    }
    if pa, ok := value.(primitive.A); ok {
        valueMSI := []interface{}(pa)
        fmt.Println("Working", valueMSI)
        fmt.Println(reflect.TypeOf(valueMSI))
    }
}

正如文档中所解释的,您可以将其中任何一种情况下的非常数值x转换为T类型(我强调了与您的问题相关的情况):

  • X可分配给T.
  • 忽略了结构标记(见下文),x的类型和T具有相同的底层类型。
  • 忽略struct标记(见下文),x的类型和T是未定义类型的指针类型,它们的指针基类型具有相同的基础类型。
  • X的类型和T都是整数或浮点数类型。
  • x's型和T型都是复型。
  • X是一个整数或一个字节或字符串片段,而T是一个字符串类型。
  • X是字符串,T是字节或符的片段。

关于底层类型的一点(重点是添加的):

每种类型T都有一个基础类型:如果T是预先声明的布尔、数字或字符串类型之一,或者是类型文字,则对应的基础类型是T本身。否则,T的基础类型就是T在其类型声明中引用的类型的基础类型。

由于primitive.A是使用类型文字[]interface{}定义的,因此它具有与[]interface{}相同的底层类型。

  • []interface{}的底层类型是[]interface{}
  • primitive.A的底层类型是[]interface{}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55870475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档