Mongodb 无法从`[]接口{}断言类型`[]字符串``
我正在尝试处理从mongodb(mgo)检索到的一些数据 不幸的是,我无法为字符串列表断言正确的类型。 我正在处理的功能如下:Mongodb 无法从`[]接口{}断言类型`[]字符串``,mongodb,casting,go,type-conversion,mgo,Mongodb,Casting,Go,Type Conversion,Mgo,我正在尝试处理从mongodb(mgo)检索到的一些数据 不幸的是,我无法为字符串列表断言正确的类型。 我正在处理的功能如下: func generate_version_histogram(userStats []interface{}) map[string]int { var histogram map[string]int for _, _u := range userStats { u := _u.(bson.M) for _, vers
func generate_version_histogram(userStats []interface{}) map[string]int {
var histogram map[string]int
for _, _u := range userStats {
u := _u.(bson.M)
for _, version := range (u["v"]).([]string) {
if _, alreadyhere := histogram[version]; alreadyhere {
histogram[version] += 1
} else {
histogram[version] = 1
}
}
}
return histogram
}
不幸的是,我遇到了以下运行时恐慌:
interface conversion: interface is []interface {}, not []string
你知道为什么会这样吗?如何检索这些字符串?一个
[]接口{}
永远不会是[]字符串
。切片有一个后备数组,这些元素必须具有一定的大小。这可能完全正确,也可能不正确,具体取决于实现细节,但[]接口{}
的每个元素都将包含一个接口{}
。如果所有这些interface{}
都是“真正的”字符串,那么它们将不是字符串本身,而是字符串的包装器或指向它的指针。因此,您必须自己转换[]接口{}
的每个单独元素
stringSlice := make([]string, len(u["v"]))
for i,raw := range u["v"] {
str,ok := raw.(string)
if !ok {
// Something is wrong, not a string like we expected
}
stringSlice[i] = str
}
[]接口{}
永远不会是[]字符串
。切片有一个后备数组,这些元素必须具有一定的大小。这可能完全正确,也可能不正确,具体取决于实现细节,但[]接口{}
的每个元素都将包含一个接口{}
。如果所有这些interface{}
都是“真正的”字符串,那么它们将不是字符串本身,而是字符串的包装器或指向它的指针。因此,您必须自己转换[]接口{}
的每个单独元素
stringSlice := make([]string, len(u["v"]))
for i,raw := range u["v"] {
str,ok := raw.(string)
if !ok {
// Something is wrong, not a string like we expected
}
stringSlice[i] = str
}
这是围棋的常见错误 原因如下:在Go
[]中,接口{}
不是一个接口,而是一个切片类型,其元素都是接口{}
类型
因为每个元素都是接口{}
,而不是int
或Foo
,所以每个元素占用更多的内存(接口{}
需要存储底层类型和包含的值)。因此,无法将[]接口
值直接转换为[]字符串
或[]T
值
那么,如何将[]接口{}
转换为[]字符串
解决方案非常简单——您可以转换每个元素
package main
import "fmt"
func main() {
foo := []interface{}{"a", "b", "c"}
// we want to convert foo to a []string
out := []string{}
for _, v := range foo {
// using a type assertion, convert v to a string
out = append(out, v.(string))
}
fmt.Println(out)
}
可运行示例这是Go的常见错误 原因如下:在Go
[]中,接口{}
不是一个接口,而是一个切片类型,其元素都是接口{}
类型
因为每个元素都是接口{}
,而不是int
或Foo
,所以每个元素占用更多的内存(接口{}
需要存储底层类型和包含的值)。因此,无法将[]接口
值直接转换为[]字符串
或[]T
值
那么,如何将[]接口{}
转换为[]字符串
解决方案非常简单——您可以转换每个元素
package main
import "fmt"
func main() {
foo := []interface{}{"a", "b", "c"}
// we want to convert foo to a []string
out := []string{}
for _, v := range foo {
// using a type assertion, convert v to a string
out = append(out, v.(string))
}
fmt.Println(out)
}
可运行示例尝试断言切片的每个成员而不是整个切片。尝试断言切片的每个成员而不是整个切片。