Golang 中的接口详解

什么是接口:接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。

接口

Golang 接口的定义

在Go语言中接口(interface)是一种类型,一种抽象的类型。

interface是一组method的集合,是duck-type programming的一种体现。

接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。

前提概要:

(1)接口中可以定义一组方法,但不需要实现,不需要方法体。并且接口中不能包含任何变量。到某个自定义类型要使用的时候(实现接口的时候),再根据具体情况把这些方法具体实现出来。
(2)实现接口要实现所有的方法才是实现。
(3)Golang中的接口不需要显式的实现接口。Golang中没有implement关键字。
(Golang中实现接口是基于方法的,不是基于接口的)


例如:
A接口 a,b方法
B接口 a,b方法
C结构体 实现了  a,b方法 ,那么C实现了A接口,也可以说实现了B接口   (只要实现全部方法即可,和实际接口耦合性很低,比Java松散得多)
(4)接口目的是为了定义规范,具体由别人来实现即可。

为什么要使用接口

type Cat struct{}

func (c Cat) Say() string { return "喵喵喵" }

type Dog struct{}

func (d Dog) Say() string { return "汪汪汪" }

func main() {
    c := Cat{}
    fmt.Println("猫:", c.Say())
    d := Dog{}
    fmt.Println("狗:", d.Say())
}

上面的代码中定义了猫和狗,然后它们都会叫,你会发现main函数中明显有重复的代码,如果我们后续再加上猪、青蛙等动物的话,我们的代码还会一直重复下去。那我们能不能把它们当成“能叫的动物”来处理呢?

像类似的例子在我们编程过程中会经常遇到:

比如一个网上商城可能使用支付宝、微信、银联等方式去在线支付,我们能不能把它们当成“支付方式”来处理呢?

比如三角形,四边形,圆形都能计算周长和面积,我们能不能把它们当成“图形”来处理呢?

比如销售、行政、程序员都能计算月薪,我们能不能把他们当成“员工”来处理呢?

Go语言中为了解决类似上面的问题,就设计了接口这个概念。接口区别于我们之前所有的具体类型,接口是一种抽象的类型。当你看到一个接口类型的值时,你不知道它是什么,唯一知道的是通过它的方法能做什么。

Go语言提倡面向接口编程

    接口是一个或多个方法签名的集合。
    任何类型的方法集中只要拥有该接口'对应的全部方法'签名。
    就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。
    这称为Structural Typing。
    所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。
    当然,该类型还可以有其他方法。

    接口只有方法声明,没有实现,没有数据字段。
    接口可以匿名嵌入其他接口,或嵌入到结构中。
    对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。
    只有当接口存储的类型和对象都为nil时,接口才等于nil。
    接口调用不会做receiver的自动转换。
    接口同样支持匿名字段方法。
    接口也可实现类似OOP中的多态。
    空接口可以作为任何类型数据的容器。
    一个类型可实现多个接口。
    接口命名习惯以 er 结尾。 

接口的定义格式如下:

 type 接口类型名 interface{
        方法名1( 参数列表1 ) 返回值列表1
        方法名2( 参数列表2 ) 返回值列表2
        …
    } 

   1.接口名:使用type将接口定义为自定义的类型名。

Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。


    2.方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。


    3.参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。   

接口案例:

演示1:

定义一个 App接口让 Phone 和 Window 结构体实现这个接口
package main

import(
	"fmt"
)

//接口是一个规范
type Apper interface{
	start()
	stop()
}
//如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口

type Phone_index struct{
	Name string
}
//手机要实现usb接口的话必须得实现usb接口中的所有方法,记住是所有方法
//可以多加方法,后面实例化可以调出来,但是接口的所有方法要包含在内
func (a Phone_index) start(){
	fmt.Println(a.Name, "启动")
}

func (a Phone_index) stop(){
	fmt.Println(a.Name,"关闭")
}

type Window_index struct{
	Name string
}

func(b Window_index) start(){
	fmt.Println(b.Name, "启动")
}

func(b Window_index) stop(){
	fmt.Println(b.Name, "关闭")
}

func(b Window_index) gane(){
	fmt.Println(

你可能感兴趣的:(#,Golang,golang,开发语言,后端)