go语言接口学习

93 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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判断将不相等。

使用接口时的四个注意事项。

  1. 和结构体类似,接口也是可以嵌套的,这种机制可以带来更加灵活的组合方式。
  2. 从空接口中取值时,类型断言是非常必要的。不使用类型断言将在编译前被GoLand工具检测出来。
  3. 当进行空接口中值的比较时,Map和Slice是无法比较的。相反,数组则可以比较,而且还是每个元素进行比较。
  4. 将一个带有类型的nil赋值给接口时,只有值为nil,而类型不为nil。此时,接口与nil判断将不相等。为了规避这个问题,我们应在返回接口类型前进行非nil判定。