避免使用空接口
空接口不提供任何信息。
尽量不要使用可以逃过编译器类型安全检查的空接口类型(interface{}
)。
在编译器里,在函数或方法参数中使用了空接口类型,意味着你没有为编译器提供关于传入实参数据的任何信息,因此将失去静态语言的类型安全检查的保护屏障,变成需要自己来保证类型安全。
在这一方面,Go 标准库就做了表率。使用 interface{}
作为参数类型的函数或方法主要有两类:
- 容器算法类:比如
sort
包、sync.Map
包以及container
下的heap
、list
、ring
等包。 - 格式化/日志类,比如
fmt
包和log
包。
这些函数或方法有一个共同特点:它们面对的都是未知类型和数据,因此使用 interface{}
是合理的。
所以总结一下:
- 仅在处理未知类型数据时使用空接口类型;
- 在其他情况下,尽可能将你需要的行为抽象成带方法的接口,并使用这样的非空接口类型作为函数或方法的参数。