第四节:接口 · Golang · 看云
[TOC]
>[success] ## **1:基本介绍**
interface类型可以定义一组方法,但是这些不需要实现。**并且interface不能包含任何变量**。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情祝把这些方法写出来。

<br>
<br>
>[success] ## **2:概念说明**
1)接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低偶合的思想。
2)Golang中的接口, 不需要显式的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字
<br>
<br>
>[success] ## **3,注意事项和细节**
1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变
量(实例)
**错误用法:**

**正确用法:**

2)接口中所有的方法都没有方法体,即都是没有实现的方法。
3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说
这个自定义类型实现了该接口。
4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)
赋给接口类型。
5)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。

<br>
<br>
6)一个自定义类型可以实现多个接口

<br>
<br>
7)Golang接口中不能有任何变量

<br>
<br>
8)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接,也必须将B,C接口的方法也全部实现。

<br>
<br>
9)interface类型默认 是一个指针(**引用类型**)**引用类型先指向地址,地址指向内存中的值,**如果没有对interface初始化就使用,那么会输出nil
<br>
<br>
10)空接interface{}没有任何方法,所以所有类型都实现了空接口,所以我们可以把所有的数据类型传给空接口\[案例演示\]

>[success] ## **4:接口最佳实现**
实现对Hero结构体切片的排序: sort.Sort(data Interface)
两种实现方法:第一种自己写冒泡排序,第二种系统内置方法sort方法
* [ ] sort方法实现

<br>
<br>
>[success] ## **5:接口VS继承**
### **实例1**

* [ ] 对上面代码的小结
1)当A结构体继承了B结构体,那么A结构就自动的继承了B结构体的字段和方法,并且可以直接使用
2)当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为实现接口是对继承机制的补充
### **实例2**
* [ ] 接口和继承解决的解决的问题不同
**继承的价值主要在于:** 解决代码的复用性和可维护性。
**接口的价值主要在于:设计**,设计好各种规范(方法),让其它自定义类型去实现这些
方法。
* [ ] 接口比继承更加灵活
接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足like - a的关系。
* [ ] 接口在一定程度上实现代码解耦
<br>
<br>
>[success] ## **6:类型断言**
### **1:类型断言的初时**

### **2:类型断言基本介绍**
* [ ] 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言,具体的如下:
```
var t float32
var x interface{}
x = t
y := x.(float32) //转换成float32
```
**注**:上面的代码,将括号中的float32修改为【x.(float64)】是否可以断言成功呢?结果是panic错误,因为x在之前的类型已经是float32,在转换成float64会报错
* [ ] 思考:当我们使用断言的时候,怎么知道断言是否成功了呢?答案是:带上监测机制,实例如下

<br>
<br>
>[success] ## **7:类型断言的最佳实践**
1. 写一个函数,循环判断传入参数的类型

<br>
2. 如何判断指针类型和结构体
