将数组转换为接口{}切片,但结果不能使用len()和其他方法

时间:2017-10-28 14:44:34

标签: go

我试过了:

var a [100]int
func fun1(src interface{}) interface{} {
    src, _ = src.([100]int) // changed []int to [100]int
    fmt.Println(reflect.TypeOf(src)) // result: []int
    dest := make([]int, len(src))
    return dest
}

出现错误:

message: 'invalid argument src (type interface {}) for len'

但如果我重新定义一个变量:

var a [100]int
func fun1(src interface{}) interface{} {
    slice_src, _ := src.([100]int) //changed []int to [100]int
    fmt.Println(reflect.TypeOf(slice_src)) // result: []int
    dest := make([]int, len(slice_src))
    return dest
}

没关系。

为什么reflect.TypeOf(src)在我使用src.([]int)之后会打印[] int但是错误显示src仍然是接口{}? 我已经检查了这个convert interface{} to int,但我仍然不了解如何使用正确的转换。

还有一个问题:

我将[]int更改为[100]int,因为之前的类型断言将返回[]false

但如果我不知道a的类型,我怎样才能使用类型断言将数组(如[99]int)作为interface{}传递给函数并返回切片([]int)?

3 个答案:

答案 0 :(得分:2)

当你第一次声明src时,在fun1(src interface{})中你正在创建一个类型为interface的变量。当然,不能len调用它。

reflect.TypeOf说[] int的原因是由于TypeOf的工作原理。 它需要一个接口{}并告诉你接口{}

中的东西的类型

所以,在第一个例子中,你已经有了一个界面 在第二个例子中,自动创建一个interface {}实例来保存你的[] int slice。

答案 1 :(得分:0)

Variables引用dynamic type

  

变量的静态类型(或仅仅类型)是其声明中给出的类型,新调用或复合文字中提供的类型,或结构化变量元素的类型。接口类型的变量也具有不同的动态类型,它是在运行时分配给变量的值的具体类型(除非该值是预先声明的标识符nil,它没有类型)。动态类型在执行期间可能会有所不同,但存储在接口变量中的值始终可分配给变量的静态类型。

在第一个示例中,src有一个dynamic typesrc的值在执行期间属于[]int类型,但最终类型将为interface,因为它是动态类型&它在声明时属于interface类型。因此,您需要在type assertion期间将变量src更改为新变量。

与您在第二个示例中所做的类似:slice_src, _ := src.([]int)

您甚至无法src, _ := src.([]int),因为最终会出现错误no new variables on left side of :=

答案 2 :(得分:0)

使用reflect.TypeOf()的类型切换方法:golang type assertion using reflect.Typeof()How to get the reflect.Type of an interface?

引用How to get the reflect.Type of an interface?

  

你不能。类型断言允许您利用语言为您提供的静态类型检查,即使您有一个接口,其类型也不会被静态检查。它基本上是这样的:

     

你有一些静态类型的变量s,其类型为t。如果您尝试使用s,就好像它是一个不同的类型,编译器通过拒绝编译来强制执行s始终具有类型t的保证,因为这会破坏保证。