无法从[[] interface {}`断言类型[[] string`

fstab:

我正在尝试处理从mongodbmgo检索到的某些数据

不幸的是,我无法断言字符串列表的正确类型。我正在使用的功能如下:

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

知道为什么会这样吗?如何检索这些字符串?

爱德华

这是Go的常见错误。

原因如下:在Go []interface{}中,不是接口,而是切片类型,其元素均为该interface{}类型。

因为每个元素都是一个interface{},而不是一个intFoo所以每个元素占用更多的内存(interface{}需要存储基础类型和所包含的值)。因此,不可能将一个[]interface直接转换为a []string[]Tvalue。

那你怎么转换[]interface{}[]string呢?

解决方案非常简单-转换每个元素。

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)
}

这里是可运行的示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

解组映射到map [string] interface {}后,对ma [string] [] string的类型断言失败

无法将args(类型[] string)用作类型[] interface {}

转到:强制转换类型无法将map [string] interface {}映射到map [string] string

使用map [string] int作为map [interface {}] interface {}类型的参数

PHPUnit 7:无法断言抛出\ InvalidArgumentException类型的异常

golang 类型断言,interface{}(pointer) 和 interface{}(object) 有什么区别?

从golang中的interface {}进行正确的类型转换后,类型断言失败

具有interface {}和类型断言的多种返回类型(在Go中)

“类型'string | string []'无法分配给类型'string'

无法将数据(类型接口{})转换为字符串类型:需要类型断言

不能将temp(类型接口{})用作equalStringArray的参数中的类型[] string:需要类型断言

无法将类型'Task <Derived>'转换为'Task <Interface>'

无效的类型断言:无法将os.Stdout转换为接口类型io.ReadWriter?

const 断言似乎无法将类型分配给泛型参数的类型 any[]

无法下标[String:AnyObject]类型的值?索引类型为String

PureScript - 无法将 Maybe String 类型与 String 类型匹配

无法将预期类型“IO [String]”与实际类型“[String]”匹配

类型化的嵌套映射map [string] interface {}返回“类型interface {}不支持索引”

如何在interface {}变量上进行类型断言以测试其是否为函数?

无法调用非函数类型'String'的值

Eclipse CDT:类型std :: string无法解析

String() 类型的值无法转换为 ArrayList

gob:类型未注册的接口:map [string] interface {}

在Golang中访问类型为map [string] interface {}的嵌套地图

Rcpp 错误:静态断言失败:无法将类型转换为 SEXP,为什么?

无法对数组类型 String[] 调用 split(String)

Swift Codable:无法解码 [String: Any] 或 [String: Decodable] 类型的字典

无法将类型为'String'的值转换为'Binding <String>'

错误:类型不兼容:String []无法转换为String