Go 分布式学习利器(13)-- Go语言的多态
文章目录
- 1. 基本的多态实现
- 2. 空接口与断言
- 3. Go接口的最佳实践
1. 基本的多态实现
我们知道C++中实现多态是通过虚函数表 和 继承来 实现的。
类似如下代码:
class Programmar{
public:virtual void write_hello_world() = 0;
}class GoProgrammar: public Programmar{
public:void write_hello_world() {printf("Go write hello workld\n");}
}class CXXProgrammar: public Programmar{
public:void write_hello_world() {printf("C++ write hello workld\n");}
}class JavaProgrammar: public Programmar{
public:void write_hello_world() {printf("Java write hello workld\n");}
}void write_program(Programmar p) {p.write_hello_world();
}
通过将不同类型的Programmar子类对象传入到write_program
函数中即能够调用对应子类的实现,达到使用父类的成员调用子类方法的目的,且调用过程是动态绑定的,即在真正开始运行的时候父类对象才能够知道自己真正的类型是什么。
Go语言不支持继承,那么Go语言是否也能够实现如上C++/Java类似的多态呢?
模拟以上代码,画出如下类图,希望Go语言能够实现该类图中的多态功能。
如下代码:
package orientedimport ("fmt""testing"
)type Code string
type Programmar interface {WriteHelloWorld() Code
}type GoProgrammar struct {
}func (p *GoProgrammar) WriteHelloWorld() Code{return "fmt.Println(\"Go write hello world\")";
}type JavaProgrammar struct {
}func (p *JavaProgrammar) WriteHelloWorld() Code{return "fmt.Println(\"Java write hello world\")";
}func writeFirstProgram(p Programmar) {fmt.Printf("%T %v\n",p,p.WriteHelloWorld())
}func TestMulti(t *testing.T){// new 关键字创建的实例是指针类型,同时GoProgrammar是interface 结构,也是只能对应指针类型的实例goPro := new(GoProgrammar)javaPro := new(JavaProgrammar)writeFirstProgram(goPro)writeFirstProgram(javaPro)
}
最后输出如下:
=== RUN TestMulti
*oriented.GoProgrammar fmt.Println("Go write hello world")
*oriented.JavaProgrammar fmt.Println("Java write hello world")
--- PASS: TestMulti (0.00s)
这样的多态实现,显然是OK的。
2. 空接口与断言
- 空接口可以表示 任何类型。
p interface{}
表示声明了一个空接口变量 p - 通过断言 可以将空接口转为指定类型
类似:v,ok := p.(int)
,其中ok表示是否转换成功,成功的话v中才有值
如下测试代码:
package empty_interfaceimport ("fmt""testing"
)func Dosomething(p interface{}){if v,ok := p.(int); ok{fmt.Println("Integer :", v)return}if v,ok := p.(string); ok{fmt.Println("String :", v)return}fmt.Print("Unkown\n")
}// 重构以上代码,使用switch 关键字看起来会更加简洁
func DosomthingSwitch(p interface{}) {switch v := p.(type) {case int:fmt.Println("Integer :", v)case string:fmt.Println("String :", v)default:fmt.Print("Unkown\n")}
}func TestInterface(t *testing.T) {Dosomething(10);Dosomething("test");DosomthingSwitch(111)
}
最后的输出如下:
=== RUN TestInterface
Integer : 10
String : test
Integer : 111
--- PASS: TestInterface (0.00s)
3. Go接口的最佳实践
为了让Go代码看起来更整洁,有以下几个关于接口的编程规范/建议:
- 在Go语言中 倾向使用较小的接口定义,很多接口只包含一个方法。
type Reader interface{Read(p []byte) (n int, err error) } type Writer interface{Write(p []byte) (n int, err error) }
- 较大的接口则可以由更多较小的接口组成
type FileOp interface {ReaderWriter }
- 只依赖与必要功能的最小接口
其中func getData(read Reader) error {... }
getData
函数用到了Reader
接口,则只需要传入Reader
参数即可,不需要将FileOp
都传入进来,从而降低接口的可复用性。意思是说,如果传入了FileOp,因为它包含了两个接口类型,那么两个接口类型的函数都需要被实现,但其实只用到Reader的函数,这就很不友好。
相关文章:

服务器搭建虚拟win云服务,云服务器创建win10虚拟机
云服务器创建win10虚拟机 内容精选换一换弹性云服务器(Elastic Cloud Server,以下简称ECS)是由CPU、内存、镜像、云硬盘组成的一种可随时获取、弹性可扩展的计算服务器,同时它结合VPC、虚拟防火墙、数据多副本保存等能力,为您打造一个高效、可…

预编译 ASP.NET 网站以进行部署
预编译 ASP.NET 网站以进行部署和更新 打开一个命令窗口并定位到包含 .NET Framework 的文件夹。 .NET Framework 将安装在以下位置。 %windir%\Microsoft.NET\Framework\version运行 aspnet_compiler 命令,在命令提示符下键入以下内容,同时指定源&…

Go 分布式学习利器(14)-- Go语言的错误处理
1. Go 的错误机制 Go 语言的错误机制中与其他语言的主要差异如下: 没有异常机制error 类型实现了 error接口type error interface {Error() string }可以通过errors.New来快速创建错误实例errors.New(" num is not in range[0,100]")如下测试代码演示基…

30 个 php 操作 redis 常用方法代码例子
这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型、 list 类型和 set 类型的数据 , 需要的朋友可以参考下redis 的操作很多的,以前看到一个比较全的博客,但是现在找不到了。查个东西搜半天,下面整理一下php 处理 re…

电脑机时,电脑死机时,为啥会忍不住扇它一巴掌?
我们为什么会把自己的愤怒发泄在机器人呢?对于人们为何会打机器这个问题,国外媒体Hopes&Fears请教了很多专家,包括精神治疗医师、机械工程师、愤怒管理专家以及流行文化专家。有一场非常重要的会议就要召开了,你必须在五分钟时…

Android所有系统版本USB调试模式打开方法
参考 Android所有系统版本USB调试模式打开方法

docker(4)docker的网络,自定义网桥
Docker 的网络 运行 ifconfig 找到 docker0 : 虚拟网卡默认网卡名称为docker0 查看docker 的网桥: 我这里默认们没有进行安装 网桥管理设备:进行安装一下; yum install bridge-utils 命令:查看网桥crctl show: 注意上图中的i…

Go 分布式学习利器(15) -- Go 实现 深搜和广搜
强化语法,回顾算法。 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系)。 涉及到的Go语言语法:…

css背景属性
CSS背景: 属性 描述 background 简写属性,作用是将背景属性设置在一个声明中。 background-attachment 背景图像是否固定或者随着页面的其余部分滚动。 background-color 设置元素的背景颜色。 background-image 把图像设置为背景。 backgroun…

scp服务器复制命令跳过已有的文件夹,Linux scp命令复制文件到其它服务器上
例如:我想将59.64.30.101中的文件复制到59.64.28.78服务器。步骤如下:1.59.64.30.101终端执行如下命令#ssh-keygen -t rsa2.密钥生成后会在/root/.ssh/文件夹下产生两个文件id_rsa id_rsa.pub将id_rsa.pub文件复制到59.64.28.78执行如下命令scp id_rsa.p…

Win2008学习(二),群集的仲裁配置
当群集中的节点发生故障时,会有其它节点继续提供服务。不过,当节点之间的通信有问题或太多故障节点时,群集服务就会停止,可是群集可以容纳多少个节点故障呢?这要由仲裁配置(Quorum Configuration࿰…

前端token刷新并发处理
添加中间件,处理多个前端来的请求时,如果token需要刷新,先查看缓存,如果没有就在redis中做个标志位进行短期缓存,其他的请求发现缓存中的token,就不再刷新token了。这样就避免了重复刷新token的问题。 中间…

Rocksdb 的一些参数调优策略
文章目录写性能优化CF write buffer sizeDB write buffer size读性能优化block cachebloom filterCompression 压缩Compaction优化通用workload的配置本文在rocksdb 整个读写链路基础上给出一些简单的调优策略,主要是通过调整一些 参数来满足我们大多数workload的性…

Java项目:酒店管理系统(java+SSM+jsp+mysql+maven)
源码获取:博客首页 "资源" 里下载! 主要技术:java springmvc mybatis mysql tomcat js jauery jsp log4j等一些常见基本技术适用于Java毕设和学习使用 主要实现: 前台:登录、注册、酒店信息浏览、搜索酒店信息…

设计模式之装饰模式(Java实现)
“怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个Xÿ…

ueditor与七牛云存储结合
2019独角兽企业重金招聘Python工程师标准>>> 摘要: ueditor与七牛云存储结合,主要是表单api. ueditor上传图片到七牛云存储 ueditor结合七牛传图片 传统上,图片是存在自己的服务器上(图片->自己服务器),如果使用…

微服务网关从零搭建——(七)更改存储方式为oracle
资源准备: 下载开源项目 新建oracle表: -- ---------------------------- -- Table structure for OcelotGlobalConfiguration -- ----------------------------CREATE TABLE OcelotGlobalConfiguration (Id NUMBER(11) NOT NULL ,GatewayName NVARCHAR2…

Rocksdb 的优秀代码(一) -- 工业级分桶算法实现分位数p50,p99,p9999
文章目录基本概念普通的分位数计算Rocksdb中的应用rocksdb中的分桶算法结果展示rocksdb 分桶算法实现一些总结 和 相关论文我们知道一个完整的监控系统必须存在p99/p999等分位数指标,作为系统可用性的评判标准之一。而像开源监控系统中做的很不错的grafana和prometh…

Java项目:前后端分离疫情防疫平台设计和实现(java+springmvc+VUE+node.js+mybatis+mysql+springboot+redis+jsp)
源码获取:博客首页 "资源" 里下载! 主要技术:Java、springmvc、VUE、node.js、mybatis、mysql、tomcat、jquery、layui、bootstarp、JavaScript、html、css、jsp、log4j等一些常见的基本技术。 主要模块功能有: 管理员…

js里的匿名函数 数组排序
// 匿名函数:其实就是函数的简写形式 var method function(){ alert("123"); } method(); // 匿名函数可以用于事件的处理 function func(){ alert("456"); } window.οnlοadfunc; window.οnlοadfunction(){ alert("加载完成࿰…

oracle监听器动态注册于静态注册的区别
2019独角兽企业重金招聘Python工程师标准>>> 1, oracle 10g 用netca方式建立的都默认为动态注册方式 2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME …

什么是Singleton?
Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。 单:指唯一 例:指实例 单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。 要点: 一、单例类只能…

磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底
文章目录1. 磁盘I/O性能指标1.1 性能指标1.2 I/O 观测1.2.1 磁盘I/O 观测1.2.2 进程I/O观测2. Fio 性能测试2.1 环境准备2.2 测试维度选择2.3 测试2.3.1 optane ssd和nvme ssd性能测试2.3.2 aep性能测试(intel persistent memory)真正测试之前 我们需要清楚 评判磁盘I/O性能 是…

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)
源码获取:博客首页 "资源" 里下载! 运行环境: java jdk 1.8 IDE环境: IDEA tomcat环境: Tomcat 7.x,8.x,9.x版本均可 主要功能说明: 管理员角色包含以下功能:管理员登录,用户管理,旅游路线管理,…

稀疏矩阵十字链表表示
类型定义 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAX 100 /*稀疏矩阵的十字链表表示:非零元素节点与表头节点公用一种类型 */ typedef struct matrixnode {int row,col;struct matrixnode *right,*down;union{int val…

thrift框架使用C++
2019独角兽企业重金招聘Python工程师标准>>> 1. 编写thrift接口文件student.thrift struct Student{1: i32 sno,2: string sname,3: bool ssex,4: i16 sage, } service Serv{i32 put(1: Student s), } 2. 用“thrift -r --gen cpp student.thrift”在gen-cpp文件夹中…

shell编程:实现shell字符串连接功能
功能:实现shell字符串连接功能 a0 s1test. s2.wav s3.mp3 s40 s500str"sox ./${s1}${a}${s2} ./${a}${s3}"./tts -c bcgirl.0.0.4.bin -b 1 -i input.txt -s 1.0 -speed 1.0 $str rm ./*.wav转载于:https://www.cnblogs.com/kay2018/p/10673110.html

一文运维zookeeper
文章目录1. zookeeper生产环境的安装配置1.1 软件配置1.2 硬件配置1.3 日志配置文件1.4 配置三节点的zookeeper集群2. zookeeper的监控方法2.1 four letters命令2.2 JMX 监控方式3. 通过zookeeper observer实现跨地域部署3.1 什么是observer3.2 observer 提升 写性能3.3 observ…

Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
源码获取:博客首页 "资源" 里下载! JAVA springboot 电商书城平台系统(已调试) 主要实现了书城网站的浏览、加入购物车操作、订单操作、支付操作、分类查看、搜索、以及后台上传图书信息以及订单管理和一些基本操作功能 主要功能截图如下&…

(周三赛)FATE
//题意 打怪的经验值 ,消耗忍耐度 看升级后还能保留的最大忍耐度 用 背包去做,不是很会啊 T T Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感&#…