首页 > 从零开始学Go之接口(一):接口

从零开始学Go之接口(一):接口

接口是双方约定的一种合作协议。接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节。

接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构。

 

声明:

接口类型是由一组方法签名定义的集合

type 接口类型名 interface{

方法名1( 参数列表1 ) 返回值列表1

方法名2( 参数列表2 ) 返回值列表2

}

type Goer interface {write() (int,error)Read() error
}

var 接口名 接口类型名

var goer Goer

接口本身包含两个数据(值,类型),只有当两者都是nil时才为接口值才为nil

 

实现:

接口类型的变量可以保存任何实现了这些方法的值。

要求:

接口的方法与实现接口的类型方法格式一致

接口中所有方法均被实现

type Goer interface {write() float64
}
​
func main() {var goer Goerv := Vertex{ 3, 4}f := MyFloat(-3.14)//goer=v //编译错误,没有v Vertex的对应方法goer = &vfmt.Println(goer.write())goer = ffmt.Println(goer.write())
}
​
type MyFloat float64
​
func (f MyFloat) write() float64 {if f < 0 {return float64(-f)}return float64(f)
}
​
type Vertex struct {X, Y float64
}
​
func (v *Vertex) write() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

运行结果:

5

3.14

类型和接口之间有一对多和多对一的关系,一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现,同时一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构体来实现

 

空接口:

指定了零个方法的接口值被称为空接口

由于每个类型的方法都至少实现了0种,所以不用指定方法,可以用来保存任何类型的值或者处理未知类型的值

interface{}

var a interface{}

例子:

func main() {var i interface{}describe(i)
​i = 42describe(i)
​i = "hello"describe(i)
}
​
func describe(i interface{}) {fmt.Printf("(%v, %T)
", i, i)
}

输出结果:

(, )

(42, int)

(hello, string)

 

函数接口:

除了结构体和类型能实现接口,函数类型也可以实现接口

// 调用器接口
type Invoker interface {// 需要实现一个Call方法Call(interface{})
}
​
// 函数定义为类型
type FuncCaller func(interface{})
​
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {// 调用f函数本体
 f(p)
}
​
func main() {// 声明接口变量var invoker Invoker// 将匿名函数转为FuncCaller类型,再赋值给接口invoker = FuncCaller(func(v interface{}) {fmt.Println("from function", v)})// 使用接口调用FuncCaller.Call,内部会调用函数本体invoker.Call("hello")
}

运行结果:

from function hello

转载于:https://www.cnblogs.com/VingB2by/p/11119835.html

更多相关:

  • 经常我们在测试接口的返回报文的时候,可能是存在于不同网页的跳转过程中,但是浏览器默认的设置是只要一跳转页面,上一个页面的请求记录就没了,是不是很烦人,有时候我们还有以迅雷不及掩耳盗铃之势把浏览器的接口监听按钮暂停掉,或者截屏,非常的难受,于是这样设置一下,切换页面的跳转情况下,接口记录依旧会保存了  ...

  • 《团队合作大坑合集》_←你挚爱的强哥→的博客-CSDN博客1、百分号无限循环小数2、小数四舍五入计算错误3、写死了年份导致跨年无法选择最新年份4、悄悄修改内外网访问限制导致外网接口不能访问5、定位索引城市的地理坐标,定位到了同名的其他城市6、更新包的时候没传完就关电脑7、前后端绑定字段不统一,字段类型不统一...https://s-z...

  • 文章目录1. 基本的多态实现2. 空接口与断言3. Go接口的最佳实践...

  • lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例可以将 lambda 表达式视为一个对象,可以将其作为参数传递1. 函数式接口 函数式接口是仅含一个抽象方法的接口,但可以指定 Object 定义的任何公有...

  • Python 与 ABC 的一个重要区别在于其类型系统。ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行。并且,ABC与当时大多数静态语言不同,采用的是类型推导(和 Haskell 一样),而不是类型声明(比如 C 语言)。而 Python 采用动态类型,所有类型检查都是在程序运行过程中,而不...

  • python是计算机二级考试的科目之一,并没有级别的划分。其考试目标是测试考生掌握Python语言知识的程度和对Python语言的编程能力、调试能力和综合应用能力,在当下的应用中是十分重要的。 什么是python Python语言是一种解释运行、面向对象、扩展性强的程序设计语言,是大学生学习计算机编程能力、理解计算机解决问题的方法的...

  • 正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢 (1)空指针所对应的是指指向的对象为空的指针。            不经发问,什么叫指向为空呢?要理解这点,必须理解如下几点(有点啰嗦,但...

  • 一、reponseType 1、什么是reponseType XMLHttpRequest.reponseType属性是一个枚举类型的属性,返回响应数据的类型,他允许我们手动的设置 返回数据的类型。如果我们将它设置为一个空字符串,它将默认的使用"text"类型。 当将reponseType设置为一个特定的类型的时候需要确保服务...

  • SNMP中,数据类型并不多。这里我们就讨论这些数据类型,而不关心这些数据类型在实际中是如何编码的。INTEGER一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号...

  • //最直接一行代码搞定---------------------------------------- '实现每间隔10个字就换行一次,多用于echarts横坐标的显示文本'.replace(/(.{10})/g,'$1 ')//灵活的方法实现任意字符插入---------------------------------------...

  • 文章目录1. 基本事务操作1.1 TransactionDB -- Pessimistic1.2 OptimisticTransactionDB1.3 Read Uncommitted1.4 SavePoint 回滚部分事务操作1.5 SetSnapshot1.6 GetForUpdate1.7 RepeatableRead2. 实现...

  • 文章目录实验要求Leader Election流程 及详细实现介绍基本角色关键超时变量关键的两个RPC实现RequestVote RPCAppendEntries RPCGo并发编程实现leader election调度...

  • 文章目录前言使用方式实现原理总结...

  • 文章目录1. 基本介绍2. 两种接口使用及简单性能对比3. DeleteRange 的基本实现3.1 写流程的实现3.2 读流程的实现 -- skyline算法...