多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
在面向对象的领域里,接口一般这样定义:**接口定义一个对象的行为** Go语言提倡面向接口编程 特性: * 接口是一个或多个方法签名的集合; * 任何类型的方法集中只要拥有该接口'对应的全部方法'签名,就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口,这称为Structural Typing; * 接口只有方法声明,没有实现,没有数据字段; * 接口可以匿名嵌入其他接口,或嵌入到结构中; * 对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针; * 只有当接口存储的类型和对象都为nil时,接口才等于nil; * 接口调用不会做receiver的自动转换; * 接口同样支持匿名字段方法; * 接口也可实现类似OOP中的多态; * 空接口可以作为任何类型数据的容器; * 一个类型可实现多个接口; ## 1.语法 在 Go 语言中,接口就是方法签名(Method Signature)的集合 ~~~ //interface definition type interfaceName interface { FindVowels() []rune } ~~~ 在Go语言中接口(interface)是一种类型,一种抽象的类型 接口命名习惯以 er 结尾; ## 2.空接口 没有包含方法的接口称为空接口。空接口表示为`interface{}`。由于空接口没有方法,因此所有类型都实现了空接口 ## 3.接口零值 接口的零值是`nil`。对于值为`nil`的接口,其底层值(Underlying Value)和具体类型(Concrete Type)都为`nil` ~~~go type Describer interface { Describe() } func main() { var d1 Describer if d1 == nil { fmt.Printf("d1 is nil and has type %T value %v\n", d1, d1) } } ~~~ ## 6.实现接口:指针接受者与值接受者 * go采用duck type方式实现接口 * 使用值接受者声明的方法,既可以用值来调用,也能用指针调用 * 对于使用指针接受者的方法,用一个指针或者一个可取得地址的值来调用都是合法的 * 类型可以实现多个接口; * 一个类型如果定义了接口的所有方法,那它就隐式地实现了该接口; ~~~ package main import ( "fmt" ) type SalaryCalculator interface { DisplaySalary() } type LeaveCalculator interface { CalculateLeavesLeft() int } type Employee struct { firstName string lastName string basicPay int pf int totalLeaves int leavesTaken int } func (e Employee) DisplaySalary() { fmt.Printf("%s %s has salary $%d", e.firstName, e.lastName, (e.basicPay + e.pf)) } func (e Employee) CalculateLeavesLeft() int { return e.totalLeaves - e.leavesTaken } func main() { e := Employee { firstName: "Naveen", lastName: "Ramanathan", basicPay: 5000, pf: 200, totalLeaves: 30, leavesTaken: 5, } var s SalaryCalculator = e s.DisplaySalary() var l LeaveCalculator = e fmt.Println("\nLeaves left =", l.CalculateLeavesLeft()) } ~~~ ### 接口嵌套 ~~~ type SalaryCalculator interface { DisplaySalary() } type LeaveCalculator interface { CalculateLeavesLeft() int } type EmployeeOperations interface { SalaryCalculator LeaveCalculator } ~~~ ## 8.接口变量的内存布局 我们可以把接口看作内部的一个元组`(type, value)`。`type`是接口底层的具体类型(Concrete Type),而`value`是具体类型的值 ![](https://img.kancloud.cn/7b/24/7b24e9227a3399476c10747a026f46a2_1148x498.png) ## 9.接口最佳实践 * 倾向于使用小的接口定义,很多接口只包含一个方法; * 较大的接口定义,可以由多个小接口定义组合而成; * 只依赖必要功能的最小接口 <br> ***** 与其他编程语言的差异: 接口为非侵入式,实现不依赖与接口定义;