十三、Golang 中的接口详解

type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列表1方法名2( 参数列表2 ) 返回值列表21.接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。2.方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
摘要由CSDN通过智能技术生成

什么是接口:接口(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(b.Name, "开局乱砂")
}



func main(){
	p := Phone_index{
		Name: "香蕉手机",
	}
	var p1 Apper
	p1 = p
	p1.start()
	p1.stop()

	w := Window_index{
		Name: "原神",
	}
	var w1 Apper
	w1 = w
	w1.start()
	w1.stop()
	w.gane()




}

几则注意点:

接口是一个规范

如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口

手机要实现app接口的话必须得实现app接口中的所有方法,记住是所有方法\

可以多加方法,后面实例化可以调出来,但是接口的所有方法要包含在内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Go接口是一个使用非常广泛的概念,可以让您以一种非常灵活的方式编写代码,同时保持代码的可读性和可维护性。接口是一种类型,它定义了一组方法,这些方法可以被不同的类型实现。下面是一些关于Go接口的详细信息: 1. 接口是一种类型。 在Go接口是一种类型,它定义了一组方法。一个类型可以实现一个或多个接口。 2. 接口定义方法。 接口是由一组方法定义的,这些方法没有实现。一个类型可以实现接口定义的所有方法,只要它们按照接口定义的方式进行实现即可。 3. 接口实现。 一个类型可以实现一个或多个接口。一个类型只需要实现接口定义的所有方法,就可以称之为实现了这个接口。 4. 接口的实现是隐式的。 在Go接口的实现是隐式的。一个类型只需要实现接口定义的所有方法,就可以自动实现这个接口。 5. 接口变量和接口值。 接口变量是一个接口类型的变量,它可以存储任何实现了该接口的值。接口值是一个接口类型的值,它可以存储任何实现了该接口的值。 6. 空接口。 空接口是一种不包含任何方法的接口。它可以存储任何类型的值。 7. 类型断言。 类型断言是一种将接口值转换为其他类型的方法。如果转换失败,它会返回一个零值和一个错误。 8. 接口的嵌套。 接口的嵌套是一种将多个接口组合成一个新接口的方法。新接口包含了所有组合接口的方法。 9. 接口的多态性。 接口的多态性是一种让不同类型的对象可以以相同的方式进行处理的方法。这样可以让您的代码更加灵活和可维护。 以上是关于Go接口的一些概念和用法的详细介绍。如果您想要更深入地了解接口,可以参考Go的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值