Go的接口与多态
什么是Go的接口?
接口可以说是一种类型,可以粗略的理解为他的变量是一堆方法。
一个简单的案例:
r,_ := http.Get("http://www.baidu.com")
io.Copy(os.Stdout,r.Body)
其中 io.copy 接受的变量是 io.Writer,io.Reader(实际上是接口类型)
而os.Stdout 和 r.Body 并不是这两种类型,但是他们实现了这两个接口,所以编译器可以识别出这是可行的的。
而 go 是怎么实现接口的呢?
可以假设 io.Reader 是这么写的:
type Reader interface{
funca()
funcb()
funcc()
}
那么在r.Body中会有如下架构:
type Body struct{
...
}
func (b Body)funca(){
...
}
func (b Body)funcb(){
...
}
func (b Body)funcc(){
...
}
在go中无需声明要实现什么接口,你只需要实现这个接口的所有方法就是直接显现了这个接口,也就是没有显示的实现接口的这一说法。
这里有一个有意思的地方。
很明显 结构体A 与结构体A 的指针是不同的类型
但 结构体A实现的方法对 A的指针有效,A的指针实现的方法对A无效
package main
import "fmt"
// duration是一个基于int类型的类型
type duration int
// 使用更可读的方式格式化duration值
func (d *duration) pretty() string {
return fmt.Sprintf("Duration: %d", *d)
}
// main是应用程序的入口
func main() {
duration(42).pretty()
// ./listing46.go:17: 不能通过指针调用duration(42)的方法
// ./listing46.go:17: 不能获取duration(42)的地址
}
多态
go利用接口实现多态的方式 简单粗暴
不同类型实现的同一接口,在接口调用时就会完美的体现出来
// 这个示例程序使用接口展示多态行为
package main
import (
"fmt"
)
// notifier是一个定义了
// 通知类行为的接口
type notifier interface {
notify()
}
// user在程序里定义一个用户类型
type user struct {
name string
email string
}
// notify使用指针接收者实现了notifier接口
func (u *user) notify() {
fmt.Printf("Sending user email to %s<%s>\n",
u.name,
u.email)
}
// admin定义了程序里的管理员
type admin struct {
name string
email string
}
// notify使用指针接收者实现了notifier接口
func (a *admin) notify() {
fmt.Printf("Sending admin email to %s<%s>\n",
a.name,
a.email)
}
// main是应用程序的入口
func main() {
// 创建一个user值并传给sendNotification
bill := user{"Bill", "bill@email.com"}
sendNotification(&bill)
// 创建一个admin值并传给sendNotification
lisa := admin{"Lisa", "lisa@email.com"}
sendNotification(&lisa)
}
// sendNotification接受一个实现了notifier接口的值
// 并发送通知
func sendNotification(n notifier) {
n.notify()
}
上述代码出自《Go语言实战》
Go的接口与多态的更多相关文章
- C#中的接口实现多态
我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02 ...
- C#面向对象(三)接口实现多态
一.如何用接口实现多态? 1.定义一个接口. using System; using System.Collections.Generic; using System.Linq; using Syst ...
- No2_4.接口继承多态_Java学习笔记_经典案例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...
- Java基础学习笔记八 Java基础语法之接口和多态
接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- java接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...
- Java 基础 接口和多态
接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...
- Java 面向对象之接口、多态
01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...
- day03(接口,多态)
接口: 概念:是功能的集合,可以当做引用数据类型的一种.比抽象类更加抽象. 接口的成员: 成员变量:必须使用final修饰 默认被 public &a ...
- Java 接口和多态
接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...
- 11_Java面向对象_第11天(接口、多态)_讲义
今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...
随机推荐
- 重新点亮linux 命令树————权限的修改[十]
前言 简单介绍一下文件的权限修改. 正文 chmod 修改文件.目录的权限 chmod u+x /tmp/testfile chmod u-x /tmp/testfile u 表示用户 g 表示组 o ...
- TaskPool 和 Worker 的对比
作用: TaskPool(任务池)和 Worker 都为应用程序提供多线程运行环境,用于处理耗时的计算任务或其他密集型任务,避免阻塞主线程,提高系统性能. 实现特点对比: 内存模型:TaskPoo ...
- stm32串口晶振不对输出乱码+汇承HC-14lora模块
最近要用到一个lora无线透传模块,然后就先用两个32开发板(用的STM32F103C8T6)试试简单的收发数据.结果,第一步串口发送一句话就寄了,我串口打印了"hi",结果出现了 ...
- 【笔记】go语言--go语言的依赖管理
[笔记]go语言--go语言的依赖管理 GO语言的依赖管理 依赖的概念,依赖就是第三方的库,即别人已经做好的库 依赖管理的三个阶段 GOPATH,GOVENDOR, go mod 三个阶段 - GOP ...
- 【笔记】go语言--切片的操作
go语言--切片的操作 接上篇切片的概念开始 //Slice添加元素 arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] s2 := s1[3:5]//[5 ...
- 字节面试:如何解决MQ消息积压问题?
MQ(Message Queue)消息积压问题指的是在消息队列中累积了大量未处理的消息,导致消息队列中的消息积压严重,超出系统处理能力,影响系统性能和稳定性的现象. 1.消息积压是哪个环节的问题? M ...
- 【OpenYurt 深度解析】边缘网关缓存能力的优雅实现
简介: 阿里云边缘容器服务上线 1 年后,正式开源了云原生边缘计算解决方案 OpenYurt,跟其他开源的容器化边缘计算方案不同的地方在于:OpenYurt 秉持 Extending your nat ...
- 基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性.本文介绍了基于 EMR O ...
- [FE] uViewUI u-navbar 曲线解决 uni onNavigationBarButtonTap 的限制与失效
uni 自带的 navigation bar 对于普通的导航需求是够用的,也允许 onNavigationBarButtonTap 加点击事件. 但是会出现异常Bug,表现为在内部页面一番操作后,再返 ...
- [Go] go-nsq 使用指南
首先你需要有一个 nsq 的服务端,nsq 由三部分构成:nsqd.nsqlookupd.nsqadmin. 快速启动 nsq 一个节点看这里:https://github.com/farwish/n ...