一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
关于接口的那些事儿
接口的定义
在Go语言中,定义接口的格式如下
type interface_name interface{
function_name( [params] ) [return_values] ...
}
在实现方法时,需要满足两个条件:
- 第一是接口中定义的的方法与实现接口的类型方法格式一致。这要求不仅方法名称相同,参数和返回值也要相同;
- 第二就是接口中定义的所有方法全部都要实现。
参考阅读: Go语言类型与接口的关系 (biancheng.net)
泛型
泛型是类型中的“万能牌” ,使用泛型作为函数参数,实际上就相当于告诉调用者:“我能兼容任何类型的参数,尽管将数据传给我就是了。”泛型以超级宽广的胸怀接纳所有类型的数据。在Go语言中的泛型,则使用空接口来实现。 而所谓的“空接口”,使用代码表示非常简单,就是:
interface{}
类型断言
在Go语言中,用来判断某个数据是否属于某种类型的方法被称为“类型断言”。
类型断言的使用格式为:
value, ok := x.(T)
interface与nil
将一个带有类型的nil赋值给接口时,只有值为nil,而类型不为nil。此时,接口与nil判断将不相等。
使用接口时的四个注意事项。
- 和结构体类似,接口也是可以嵌套的,这种机制可以带来更加灵活的组合方式。
- 从空接口中取值时,类型断言是非常必要的。不使用类型断言将在编译前被GoLand工具检测出来。
- 当进行空接口中值的比较时,Map和Slice是无法比较的。相反,数组则可以比较,而且还是每个元素进行比较。
- 将一个带有类型的nil赋值给接口时,只有值为nil,而类型不为nil。此时,接口与nil判断将不相等。为了规避这个问题,我们应在返回接口类型前进行非nil判定。