1。定义
接口是类型可以定义一组方法,但是这些不需要实现,并且界面不能包含任何变量。
比如:
<代码>类型{界面示例 Method1(参数列表)返回值列表 Method2(参数列表)返回值列表 … }代码>
2.接口类型默认是一个指针
<代码>类型{界面示例 Method1(参数列表)返回值列表 Method2(参数列表)返回值列表 … } var的例子 a.Method1() 代码>
3。接口实现
。Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口,因此,Golang中没有实现类似的关键字
b。如果一个变量含有了多个接口类型的方法,那么这个变量就实现了多个接口。
c。如果一个变量只含有了1个接口的方部分方法,那么这个变量没有实现这个接口。
4 .多态
一种事物的多种形态,都可以按照统一的接口进行操作
5。接口嵌套
一个接口可以嵌套在另外的接口,如下所示:
<代码>{读写接口类型 bool读取缓冲区(b) bool写缓冲区(b) } {锁接口类型 Lock () 解锁() } 类型文件接口{ 读写 锁 Close () }代码>
-
<李>类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型可以采用以下方法进行转换:李>
<代码> var t int var x接口{} x=t y=x。(int)//转成int var t int var x接口{} x=t y=x。(int)//转成int,带检查 代码>
7。练习,写一个函数判断传入参数的类型
<代码>函数分类器(物品…接口{}){ 对于我来说,x:={范围项目 开关x。(类型){ 案例bool: fmt。Printf("参数# % d是一个bool \ n”,我) 案例float64: fmt。Printf("参数# % d float64 \ n”,我) int, int64: fmt。Printf (" # % d参数是int \ n”,我) 情况下零:fmt。Printf("参数# % d是nil \ n”,我) 案例字符串:fmt。Printf (" # % d参数是一个字符串\ n”,我) 默认值:fmt。Printf("参数# % d类型是未知\ n”,我) } }代码>
8。类型断言,采用方型开关式
<代码>切换t:=areaIntf。{案例*广场:fmt(类型)。Printf (" % % v T和价值类型广场\ n”, T, T) 案例*圆:fmt。Printf("型圆% T和v值% \ n”, T, T) 案例float32: fmt。Printf("类型float32与值% v \ n”, t)案例nil: fmt。Println (nil值:什么检查?) 默认值:fmt。Printf(意想不到的类型% T, T)} 代码>
<人力资源/>
<代码>包主要 进口“fmt”//没有方法的空接口,任何类型都可以 类型测试接口{} 函数main () { var一个接口{} 一个=666 fmt.Println (a) fmt。Printf("的类型是:% T”, a) }代码>
输出:
666
的类型是:int
过程完成退出代码0
<代码>包主要 进口“fmt”//接口里的方法必须全部实现! {护理员接口类型 GetName()字符串 Run () 迪迪() } 宝马struct类型{ 名称字符串 } 字符串函数(p *宝马)GetName () { 返回p.Name } func (p *宝马)Run () { fmt。Printf (" % s \ n”运行,p.Name) } func (p *宝马)迪迪(){ fmt。Printf (" % s是迪迪\ n”, p.Name) } 函数main () { var汽车护理人//如果接口中的方法只声明不实现,则是零//fmt.Println(汽车)//不实现运行方法而调用会报的错//car.Run () var bmw宝马 宝马。Name=" x6 "//因为struct宝马是指针类型,所以宝马要引用传递 车=和宝马 car.Run () }代码>
输出:
x6运行