在Go语言中接口(interface)是一种类型,一种抽象的类型。
interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。
在Golang中,多态特性主要是通过接口来体现的。
接口快速入门
用程序来模拟一下上图中的应用场景。
package main
import(
"fmt"
)
//定义一个接口
type Usb interface{
//声明了两个没有实现的方法
Start()
Stop()
}
type Phone struct{
}
//让Phone实现Usb接口的方法
func (p Phone) Start(){
fmt.Println("手机开始工作了.....")
}
func (p Phone) Stop(){
fmt.Println("手机停止工作了.....")
}
type Camera struct{
}
//让Camera实现Usb接口
func (c Camera) Start(){
fmt.Println("相机开始工作了.....")
}
func (c Camera) Stop(){
fmt.Println("相机停止工作了.....")
}
//计算机
type Computer struct{
}
//编写一个方法Working,接受一个Usb接口类型的变量
func (c Computer) Working(usb Usb){
//通过usb接口变量来调用Start和Stop方法
usb.Start()
usb.Stop()
}
func main() {
computer := Computer{}
phone := Phone{}
camera := Camera{}
computer.Working(phone)
computer.Working(camera)
}
运行结果:
interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情况把这些方法写出来。
基本语法:
type 接口名 interface{
method1(参数列表) 返回值列表
method2(参数列表) 返回值列表
}
说明:
- 接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想。
- Golang中的接口,不需要显示的实现。只要有一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口。Golang中没有implement这样的关键字。
- 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
package main
import(
"fmt"
)
type AInterface interface{
Say()
}
type stu struct{
name string
}
func (s stu)Say(){
fmt.Println("stu Say()...")
}
func main(){
var s stu
var a AInterface = s
a.Say()
}
- 接口中所有方法都没有方法体,即都是没有实现的方法。
- 在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。
- 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例赋给接口类型。
- 只要是自定义数据类型,就可以是实现接口,不仅仅是结构体类型。
package main
import(
"fmt"
)
type AInterface interface{
Say()
}
func (i integer)Say(){
fmt.Println("integer Say()...")
}
type integer int
func main(){
var i integer
var a AInterface = i
a.Say()
}
运行结果:
-
一个自定义类型可以实现多个接口。
-
golang接口中不能有任何边变量。
-
interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil.
-
空接口interface{}没有任何方法,所以所有类型都实现了空接口,我们可以把任何一个变量赋给空接口。
package main
import(
"fmt"
)
type T interface{
}
func main(){
var i int = 100
var t T = i
fmt.Println(t)
}
博主首页链接:https://blog.csdn.net/weixin_44736475
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️