Go 语言
接口
避免空接口

避免使用空接口

空接口不提供任何信息。

尽量不要使用可以逃过编译器类型安全检查的空接口类型(interface{})。

在编译器里,在函数或方法参数中使用了空接口类型,意味着你没有为编译器提供关于传入实参数据的任何信息,因此将失去静态语言的类型安全检查的保护屏障,变成需要自己来保证类型安全。

在这一方面,Go 标准库就做了表率。使用 interface{} 作为参数类型的函数或方法主要有两类:

  • 容器算法类:比如 sort 包、 sync.Map 包以及 container 下的 heaplistring 等包。
  • 格式化/日志类,比如 fmt 包和 log 包。

这些函数或方法有一个共同特点:它们面对的都是未知类型和数据,因此使用 interface{} 是合理的。

所以总结一下:

  • 仅在处理未知类型数据时使用空接口类型;
  • 在其他情况下,尽可能将你需要的行为抽象成带方法的接口,并使用这样的非空接口类型作为函数或方法的参数。