今天运行以下代码时,发现[]string不能向[]interface自动转换,代码如下
|
|
经过一番google,了解到如下知识:
interface slice 与 万能类型 empty interface 是不一样的,可以直接将任何类型的值传给万能类型,但是
不能将任何类型的 slice 直接传给 interface slice
,因为 interface slice 并不是万能类型,只是里面装的万能类型的slice,所以反过来你也不能直接将 interface slice 强制转换成特定类型的 slice
万能类型(interface{})很神奇,就像 C 里面的 void,但是C本身是一门不安全的语言,可以直接操纵原始的二进制位,所以 void 是有必要的,但是这个东西对于强类型的Go是非常有害的和不安全的,它让你失去了静态强类型所带来的好处,很多本该在编译期就检查出来的类型问题,变成了运行时错误,我用过一些数据库方面的第三方库,就因为其内部使用了大量 interface{} 导致程序跑起来时不时有运行时类型错误非常头疼,另外大量使用 type assertion 代码是非常丑陋的。所以一定要尽量避免使用这个类型,这也是我泡 #go-nuts 频道时里面的大神给的建议
InterfaceSlice官方解释
虽然[]string不会自动转换成[]interface,但是我们可以手动将[]string转换为[]interface
|
|