这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言接口
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言接口
-
Go语言接口虽然也是抽象方法的集合,但没有要求类型强制实现接口,类型实现接口也不需要事先声明。Go语言的接口尽管不能实例化,但是可以声明变量,可以被赋值,赋值后就等同实例化了。
-
在Go语言中接口也是一种数据类型,而且是命名数据类型。因此,使用接口之前是需要先声明的。
-
Go语言的接口是抽象方法的集合,其类型定义的实体就是各种方法列表,不应该包含其它内容。
-
Go语言接口声明的语法格式如下所示:
type Inter interface{ Method1(para_list)(return_list) ... MethodN(para_list)(return_list) } -
接口类型名称为任何合法的Go语言标识符。Go语言的接口命名习惯是在名字后面加
er,尤其是在方法名字后加er。考虑可见性问题,建议首字母大写。方法名称也一样,建议采用首字母大写,便于导出。Go语言习惯上一个接口仅放置一个方法,这样极容易被其它数据类型实现。 -
接口中的方法为抽象方法,仅有方法名称和方法签名,不含接受者。当方法被实现以后,就有接受者了。
-
抽象方法也可以不带参数,如下所示:
type Gater interface{ Gat() } -
接口为一种数据类型,可以用于声明接口型变量。可以给接口变量赋值,也可以用接口型变量作为函数的参数。尤其在类型断言表达式中只能使用接口类型的变量。
-
Go语言的接口类型与结构体类型一样,可以实现嵌套与组合。假如接口A嵌入到接口B中,而接口B又嵌入到接口C中,这样一层套一层,称为接口的嵌套。
-
将已经声明的接口用其名称直接插入到另一个接口的内部,形成嵌套,就可以生成一个新接口。
-
根据已有的接口来生成新的接口,这是一个常用的方法。接口的嵌入可以认为是接口的继承,多个接口组合一起嵌入,可以实现多继承。
-
内嵌接口可以直接展开在外层接口也不影响接口的实现。
-
一个没有被实现的接口是没有什么意义的,接口被实现了才能体现它的用处。
-
Go语言并没有强制要求类型明确声明继承或实现某接口,实现完全是隐式进行的。而且实现接口和声明接口没有任何时间上的顺序要求,完全可以先实现后声明。
-
Go语言规定,任何数据类型方法集合的子集包含了某接口的方法集合,就认为该数据类型实现了某接口。实现了接口的任何数据类型都可以给接口赋值。
-
在接口中定义的是抽象方法,并没有接受者,在具体的类型实现中,需要明确接受者类型:值类型或指针类型。
-
实现接口方法只能选择值类型或指针类型其中之一作为接受者类型,不可以两者都实现。
-
以指针类型接受者实现的方法,赋给接口变量的值也必须是地址,给它赋实例的值是不行的。