我有一个map [string] interface {},它是使用新mongo-go-driver的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语句不被评估?
这是否意味着原始的!=接口数组?
在文档https://godoc.org/go.mongodb.org/mongo-driver/bson/primitive中,类型A定义为“一个A代表一个BSON数组。该类型可用于简洁明了地表示一个BSON数组。通常在序列化为BSON时使用。对于反序列化,应使用RawArray或Array类型。“
我该怎么做?我要访问聚合键的值吗?
答案 0 :(得分:2)
您可以使用 conversion expression 将primitive.A
类型的值转换为[]interface{}
。 >
因此,您可以这样做:
T(x)
如文档中所述,您可以在以下任何一种情况下将非恒定值x转换为类型T(对于与您的问题相关的情况,我特别强调):
- x可分配给T。
- 忽略结构标签(见下文), x的类型和T具有相同的含义 基础类型。
- 忽略struct标记(见下文),x的类型和T是指针类型 不是定义的类型,它们的指针基类型有 相同的基础类型。
- x的类型和T都是整数或浮点类型。
- x的类型和T都是复数类型。
- x是整数或字节或符文的一部分,T是字符串类型。
- x是一个字符串,T是一个字节或符文切片。
underlying types上的一点点(添加了强调):
每个类型T都有一个底层类型:如果T是预先声明的类型之一 布尔,数字或字符串类型,或类型文字, 相应的基础类型是T本身。否则, T的基础 type是T在其类型中引用的类型的基础类型 声明。
由于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))
}
}
是使用类型文字 primitive.A
定义的,因此它具有与[]interface{}
相同的底层类型。
[]interface{}
的基础类型为[]interface{}
。[]interface{}
的基础类型为primitive.A
。