【发布时间】:2019-09-16 03:17:10
【问题描述】:
我有一个从使用新的 mongo-go-driver 的 mongo 查询生成的 map[string]interface{}
我想处理映射中的某些值并替换属于聚合键的值中的 £ 字符
这是地图:
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
但打印时它似乎是地图的[]接口{}? [查看结果2]
考虑到这一点,为什么不评估第二个 if 语句?
这是否意味着primitive.A != 接口数组?
在https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive的文档中,A类型被定义为“一个A代表一个BSON数组。这种类型可以用来以简洁易读的方式来表示一个BSON数组。它一般应该在序列化为BSON时使用。对于反序列化时,应使用 RawArray 或 Array 类型。”
我该怎么做?我想访问聚合键的值?
【问题讨论】:
-
为什么不使用
value.(primitive.A)? -
@mkopriva 我们正在使用将 £ 转换为 $ 的函数来接受接口(因为它是一个具有此文件之外的范围的包)。所以理想情况下,我们希望一切都可以使用它
-
... “这是否意味着primitive.A != 接口数组?”
primitive.A是一个接口切片与[]interface{}不是 same type 这就是您的 type assertion 失败的原因。它们确实共享相同的内存布局,因此将一种转换为另一种很容易,就像T(v)。 -
我明白你的意思,但我想问的是如何将 primitive.A 转换为 []interface{},因为它们本质上相似