多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] >[success] ## **1:基本介绍** interface类型可以定义一组方法,但是这些不需要实现。**并且interface不能包含任何变量**。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情祝把这些方法写出来。 ![](https://img.kancloud.cn/4b/89/4b896ac9ae4ce066480073d385988349_1280x295.png) <br> <br> >[success] ## **2:概念说明** 1)接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低偶合的思想。 2)Golang中的接口, 不需要显式的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字 <br> <br> >[success] ## **3,注意事项和细节** 1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变 量(实例) **错误用法:** ![](https://img.kancloud.cn/db/d9/dbd9c223866cfb75f3bebf704eb62eba_1280x491.png) **正确用法:** ![](https://img.kancloud.cn/2e/3c/2e3ce1de882301f81e395bf1c6cd8686_1280x643.png) 2)接口中所有的方法都没有方法体,即都是没有实现的方法。 3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说 这个自定义类型实现了该接口。 4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量) 赋给接口类型。 5)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。 ![](https://img.kancloud.cn/04/1b/041b05a2e13406abba8c0dbec61a06fe_1280x472.png) <br> <br> 6)一个自定义类型可以实现多个接口 ![](https://img.kancloud.cn/f4/bf/f4bf2079b9947c85aff7439d77c97903_936x720.png) <br> <br> 7)Golang接口中不能有任何变量 ![](https://img.kancloud.cn/7a/44/7a447ca63b3e7239de1fb1b2cb75a97e_1280x223.png) <br> <br> 8)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接,也必须将B,C接口的方法也全部实现。 ![](https://img.kancloud.cn/83/9a/839a539cd6d5175d832ca7e7d2dcc54b_767x720.png) <br> <br> 9)interface类型默认 是一个指针(**引用类型**)**引用类型先指向地址,地址指向内存中的值,**如果没有对interface初始化就使用,那么会输出nil <br> <br> 10)空接interface{}没有任何方法,所以所有类型都实现了空接口,所以我们可以把所有的数据类型传给空接口\[案例演示\] ![](https://img.kancloud.cn/a4/6c/a46ca4b1bc12e1b3b4aabdc93b9cd441_1280x681.png) >[success] ## **4:接口最佳实现** 实现对Hero结构体切片的排序: sort.Sort(data Interface) 两种实现方法:第一种自己写冒泡排序,第二种系统内置方法sort方法 * [ ] sort方法实现 ![](https://img.kancloud.cn/5d/57/5d57af814db0fb8d2228bc3a31a62119_1280x519.png) <br> <br> >[success] ## **5:接口VS继承** ### **实例1** ![](https://img.kancloud.cn/20/4f/204f1466c2a14f42a0a788d276ee0e6e_824x720.png) * [ ] 对上面代码的小结 1)当A结构体继承了B结构体,那么A结构就自动的继承了B结构体的字段和方法,并且可以直接使用 2)当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为实现接口是对继承机制的补充 ### **实例2** * [ ] 接口和继承解决的解决的问题不同 **继承的价值主要在于:** 解决代码的复用性和可维护性。 **接口的价值主要在于:设计**,设计好各种规范(方法),让其它自定义类型去实现这些 方法。 * [ ] 接口比继承更加灵活 接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足like - a的关系。 * [ ] 接口在一定程度上实现代码解耦 <br> <br> >[success] ## **6:类型断言** ### **1:类型断言的初时** ![](https://img.kancloud.cn/ed/2c/ed2c87c1d6c24d74d7dea1ef928dec74_1280x426.png) ### **2:类型断言基本介绍** * [ ] 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言,具体的如下: ``` var t float32 var x interface{} x = t y := x.(float32) //转换成float32 ``` **注**:上面的代码,将括号中的float32修改为【x.(float64)】是否可以断言成功呢?结果是panic错误,因为x在之前的类型已经是float32,在转换成float64会报错 * [ ] 思考:当我们使用断言的时候,怎么知道断言是否成功了呢?答案是:带上监测机制,实例如下 ![](https://img.kancloud.cn/57/60/5760f5d95df79b8c7ee4e23fbdc994b0_1218x720.png) <br> <br> >[success] ## **7:类型断言的最佳实践** 1. 写一个函数,循环判断传入参数的类型 ![](https://img.kancloud.cn/56/c6/56c657fe39d30e4ea2ebb619d2f65cb9_1013x720.png) <br> 2. 如何判断指针类型和结构体 ![](https://img.kancloud.cn/65/66/6566d05014262839d12022075460d0ff_928x720.png)