我有一个映射接口{},它是从使用新的mongo -go驱动程序的mongo查询生成的。
我希望处理映射中的某些值,并替换属于聚合键的值中的£字符。
这是地图:
result2 = map[aggregate:[map[£match:map[Source:Cities]] map[£sort:map[Order:1]]] collection:aggregate_stats db:stats]在地图上循环:
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语句的输出给出了如下类型:
primitive.A但当打印时,它似乎是地图的[]接口{}?请参阅result2
考虑到这一点,为什么没有计算第二个if语句?
这是否意味着原始的.A !=接口数组?
在文档中,https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive类型A被定义为“A表示BSON数组。这种类型可以以简洁和可读的方式表示BSON数组。通常应该在序列化到BSON时使用它。对于反序列化,应该使用RawArray或数组类型。”
我该怎么做?我想访问聚合键的值吗?
发布于 2019-04-26 16:25:32
可以通过使用primitive.A (其形式为T(x) )的https://golang.org/ref/spec#Conversions将类型为T(x)的值转换为T(x)。
所以在你的情况下,你可以这样做:
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类型(我强调了与您的问题相关的情况):
关于底层类型的一点(重点是添加的):
每种类型T都有一个基础类型:如果T是预先声明的布尔、数字或字符串类型之一,或者是类型文字,则对应的基础类型是T本身。否则,T的基础类型就是T在其类型声明中引用的类型的基础类型。
由于primitive.A是使用类型文字[]interface{}定义的,因此它具有与[]interface{}相同的底层类型。
[]interface{}的底层类型是[]interface{}。primitive.A的底层类型是[]interface{}。https://stackoverflow.com/questions/55870475
复制相似问题