知识卡片
具体接口切片优于空接口切片
内容
把一组值放进[]interface{}切片再逐个做类型断言去调用方法,是能跑但不安全的做法——断言可能失败导致panic,而且编译器完全帮不上忙,任何类型不满足要求都要等到运行时才暴露。发散:这是”尽早收窄类型”的例子——[[空接口作为类型无关容器]]的interface{}能装下一切,但装下一切的代价是几乎所有类型信息都被抹掉,之后要用就得一点点断言找回来;一开始就用满足实际需求的。
参考来源
- 位置:《Go语言程序设计》第6章《面向对象编程》(源文件:_epub-src/OEBPS/text00035.html)
- 结论依据:原文在该章节围绕“把一组值放进`[]interface{}`切片再逐个做类型断言去调用方法,是能跑但不安全的做法——断言可能失败…”给出定义、示例或限制条件;摘录中的术语、代码片段或对比关系直接支撑本卡片的结论。
- 原始内容:同的底层表示。但Go语言又会认为这两个底层表示有所区别。在这里, Stack 类型只是一个空接口类型切片(也就是一个可变长数组的引用)的别名,但它与普通的 []interface{} 类型又有所区别。 由于Go语言的所有类型都实现了空接口,因此任意类型的值都可以存储在 Stack 中。 内置的数据集合类型(映射和切片)、通信通道(可缓冲)…