为什么可以将切片分配给空接口但不能将其强制转换为相同的空接口

Why can you assign a slice to an empty interface but not cast it to the same empty interface

为什么 golang 不支持将切片转换为空接口?但是,您可以通过将具有空接口的变量声明为类型并将切片分配给该变量来解决它。为什么它们不是一回事?

示例:https://play.golang.com/p/r4LXmR4JhF0

首先,Go 根本不支持转换

Go* 中根本没有类型转换。

您尝试做的是类型断言。

您尝试失败的原因有两个。两者都由编译器解释:

  1. invalid type assertion: slice.(<inter>) (non-interface type []interface {} on left)

    您不能将任何非接口类型类型断言到接口。

  2. non-name *castedSlice on left side of :=

    *castedSlice 在此上下文中无效。

如果要将切片存储在 interface{} 类型的变量中,赋值是正确的方法。您可以通过几种方式做到这一点:

  1. 如您所见,这有效:

    var result interface{}
    result = slice
    
  2. 您可以合并这两行:

    var result interface{} = slice
    
  3. 你也可以做一个简短的变量声明:

    result := interface{}{slice}
    

*以免有人吹毛求疵:在技术上可以通过使用 unsafe 包来完成与 Go 中的类型转换相同的操作,但是因为这超出了语言规范,并且根据定义是不安全的,我认为 Go 不支持类型转换仍然是一个合理的说法。