我试过了:
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
)?
答案 0 :(得分:2)
当你第一次声明src时,在fun1(src interface{})
中你正在创建一个类型为interface的变量。当然,不能len
调用它。
reflect.TypeOf说[] int的原因是由于TypeOf的工作原理。 它需要一个接口{}并告诉你接口{}
中的东西的类型所以,在第一个例子中,你已经有了一个界面 在第二个例子中,自动创建一个interface {}实例来保存你的[] int slice。
答案 1 :(得分:0)
从Variables引用dynamic type
:
变量的静态类型(或仅仅类型)是其声明中给出的类型,新调用或复合文字中提供的类型,或结构化变量元素的类型。接口类型的变量也具有不同的动态类型,它是在运行时分配给变量的值的具体类型(除非该值是预先声明的标识符nil,它没有类型)。动态类型在执行期间可能会有所不同,但存储在接口变量中的值始终可分配给变量的静态类型。
在第一个示例中,src
有一个dynamic type
。 src
的值在执行期间属于[]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的保证,因为这会破坏保证。