【发布时间】:2022-01-19 10:35:26
【问题描述】:
为什么 golang 不支持将切片转换为空接口?但是,您可以通过将具有空接口的变量声明为类型并将切片分配给该变量来解决它。为什么它们不一样?
【问题讨论】:
-
Go 根本不支持转换。
-
您是类型断言,而不是强制转换。这是完全不同的东西。请再次完成 Tour of Go 以了解此类基础知识。您的
slice不是接口类型,这不能按类型断言。
为什么 golang 不支持将切片转换为空接口?但是,您可以通过将具有空接口的变量声明为类型并将切片分配给该变量来解决它。为什么它们不一样?
【问题讨论】:
slice 不是接口类型,这不能按类型断言。
首先,Go 根本不支持转换。
Go* 中根本没有类型转换。
您尝试做的是类型断言。
您的尝试失败有两个原因。两者都由编译器解释:
invalid type assertion: slice.(<inter>) (non-interface type []interface {} on left)
您不能将任何非接口类型声明为接口。
non-name *castedSlice on left side of :=
*castedSlice 在此上下文中无效。
如果要将切片存储在interface{} 类型的变量中,则赋值是正确的方法。您可以通过以下几种方式做到这一点:
正如您所发现的,这是可行的:
var result interface{}
result = slice
你可以结合这两行:
var result interface{} = slice
你也可以做一个简短的变量声明:
result := interface{}{slice}
*以免有人挑剔声明:使用 unsafe 包在技术上可以完成与 Go 中的类型转换相同的操作,但由于这超出了语言规范,并且根据定义,不安全,我认为 Go 不支持类型转换仍然是一个合理的说法。
【讨论】: