基本介绍

在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
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️