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

fst*_*tab 1 casting type-conversion go mongodb 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 _, version := range (u["v"]).([]string) {
            if _, alreadyhere := histogram[version]; alreadyhere {
                histogram[version] += 1
            } else {
                histogram[version] = 1
            }
        }
    }
    return histogram
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我遇到了以下运行时恐慌:

interface conversion: interface is []interface {}, not []string
Run Code Online (Sandbox Code Playgroud)

对于为什么会发生这种情况的任何想法?我该如何检索这些字符串?

Edw*_*rdr 10

这是Go常见的错误.

原因如下:在Go []interface{}中不是接口,它是切片类型,其元素都是interface{}类型.

因为每个元素都是a interface{},而不是说,int或者Foo,每个元素占用更多的内存(interface{}需要存储基础类型和包含的值).因此,无法直接将[]interface值转换为值[]string[]T值.

你怎么转换[]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)
}
Run Code Online (Sandbox Code Playgroud)

这里可运行的例子.