接口是自定义类型,是对是其他类型行为的抽象
定义
接口定义使用interface标识,声明了一系列的函数签名
(函数名、函数参数、函数返回值),在定义接口时可以指定接口名称,在后续声明接口变量时使用
声明
声明接口变量只需要定义变量类型为接口名,此时变量被初始化为nil
13.02.png赋值
类型对象
当自定义类型实现了接口类型中声明的所有函数时,则该类型的对象可以赋值给接口变量,并使用接口变量调用实现的接口
-
方法接收者全为值类型的方法
13.03.png 13.04.png -
方法接收者全为指针类型的
13.05.png 13.06.png -
方法接收者既有值类型又有指针类型的
13.07.png赋值应该使用哪一个?原因?
13.08.png 13.09.png -
问题
13.10.png
接口对象
当接口(A)包含另外一个接口(B)中声明的所有函数时(A接口函数时B接口函数的父集,B时A的子集),则接口(A)的对象也可以赋值给其子集的接口(B)变量
13.11.png 13.12.png若两个接口声明同样的函数签名,则者两个接口完全等价
当类型和父集接口赋值给接口变量口,只能调用接口变量定义接口中声明的函数(方法)
类型断言&查询
当父集接口或者类型对象赋值给接口变量后,需要将接口变量重新转换为原来的类型,需要使用类型断言/查询
断言
语法: 接口变量.(Type)
13.13.png查询
可以通过switch-case+接口变量.(type)查询变量类型,并选择对应的分支块
13.14.png接口匿名嵌入
接口之中也可以嵌入已存在的接口,从而实现接口的扩展
定义
13.15.png实现
13.16.png使用
13.17.png匿名接口
在定义变量时将类型指定为接口的函数签名的接口,此时叫匿名接口。匿名接口常用于初始化一次接口变量的场景
13.18.png空接口
不包含任何函数签名的接口叫空接口,空接口声明的变量可以赋值为任何类型的变量(任意接口)
定义
语法: interface{}
13.19.png使用场景
常声明函数参数类型为interface{},用于接收任意类型的变量
13.20.png 13.21.png
网友评论