深入理解Go语言实现多态?

 更新时间:2022-05-13 14:10:17   作者:佚名   我要评论(0)

目录多态是什么Go语言多态举例总结多态是什么
相信学过Java这种面向对象语言的同学对于多态来说都不陌生,在代码执行的时候,能够根据子类的

多态是什么

相信学过Java这种面向对象语言的同学对于多态来说都不陌生,在代码执行的时候,能够根据子类的类型去执行子类当中的方法。多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。

Go语言多态举例

有这样一个场景,我们在应用开发中涉及到很多通知事件,通知的类型可以是通过微信、QQ、Email等,那么我们可以抽象出一个接口,定义一个通知的接口,然后微信通知类、QQ通知类、Email通知类分别实现对应的通知方法。

定义一个通知类型:notifier

// 通知者接口
type Notifier interface {
    // 通知方法,可以由具体的类进行实现
    notify()
}

定义微信类型、QQ类型、Email类型,并实现notify方法,以指针类型作为方法的接收者

type WechatNotifier struct {
?? ?Name ? ?string
?? ?Message string
}

func (w *WechatNotifier) notify() {
?? ?fmt.Printf("%v notify %v \n", w.Name, w.Message)
}

type QQNotifier struct {
?? ?Name ? ?string
?? ?Message string
}

func (q *QQNotifier) notify() {
?? ?fmt.Printf("%v notify %v \n", q.Name, q.Message)
}

type EmailNotifier struct {
?? ?Name ? ?string
?? ?Message string
}

func (e *EmailNotifier) notify() {
?? ?fmt.Printf("%v notify %v \n", e.Name, e.Message)
}

定义发送通知方法,入参为Notifier;等需要调用的时候,需要传入实现了Notifier中的接口的类型

func sendNotify(notifier Notifier) {
    notifier.notify()
}

测试一下

func main() {
?? ?w := &WechatNotifier{
?? ??? ?Name: ? ?"微信",
?? ??? ?Message: "微信消息",
?? ?}

?? ?q := &QQNotifier{
?? ??? ?Name: ? ?"QQ",
?? ??? ?Message: "QQ消息",
?? ?}

?? ?e := &EmailNotifier{
?? ??? ?Name: ? ?"Email",
?? ??? ?Message: "Email消息",
?? ?}

?? ?// 接受微信类型
?? ?sendNotify(w)
?? ?// 接受QQ类型
?? ?sendNotify(q)
?? ?// 接受Email类型
?? ?sendNotify(e)
}

测试结果如下:

总结

Golang中主要是采用了接口来实现多态,先定义一个抽象接口,然后再定义具体的实现类并实现接口中的方法,当我们需要定义一个通用的方法时,方法的入参可以接收一个接口类型,这样在程序设计的时候就可以不必多写类似的方法从而接受不同的类了,在程序的运行时,就可以动态地把该接口指向的具体类型,从而执行具体类型的方法!

到此这篇关于深入理解Go语言实现多态 的文章就介绍到这了,更多相关Go语言 多态 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • go语言interface接口继承多态示例及定义解析
  • 浅谈Go语言多态的实现与interface使用
  • Go语言实现类似c++中的多态功能实例

相关文章

  • 深入理解Go语言实现多态?

    深入理解Go语言实现多态?

    目录多态是什么Go语言多态举例总结多态是什么 相信学过Java这种面向对象语言的同学对于多态来说都不陌生,在代码执行的时候,能够根据子类的
    2022-05-13
  • 300行代码实现go语言即时通讯聊天室

    300行代码实现go语言即时通讯聊天室

    学了2年Java,因为工作原因需要转Golang,3天时间学习了下go的基本语法,做这样一个聊天室小项目来巩固串联一下语法。 实现的功能:公聊,私
    2022-05-13
  • 分析讲解Java?Random类里的种子问题

    分析讲解Java?Random类里的种子问题

    可以说在现在的计算机语言里面,以及普通用户这里,都是没有办法获得真正的 随机数的。真正的随机数现在也只有在量子计算机当中才有获得。 所
    2022-05-13
  • networkx库绘制带权图给无权图加权重输出

    networkx库绘制带权图给无权图加权重输出

    目录问题输出结果如何只输出权重输出结果问题 最近在研究图学习,在用networkx库绘图的时候发现问题。 ''' author:zheng time:2020.10.23
    2022-05-13
  • SpringBoot整合Mongodb实现增删查改的方法

    SpringBoot整合Mongodb实现增删查改的方法

    目录一、什么是MongoDB二、在Window10上安装MongoDB三、配置MongoDB服务四、启动服务五、SpringBoot整合MongoDB一、什么是MongoDB MongoDB与
    2022-05-13
  • Java实现跳跃表的示例详解

    Java实现跳跃表的示例详解

    跳表全称叫做跳跃表,简称跳表,是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序列表上面增加多级索引,
    2022-05-13
  • go语言心跳超时的实现示例

    go语言心跳超时的实现示例

    目录一、背景二、心跳超时的实现2.1 通过select case (设计概念比较多)2.2 通过time.sleep(简单有效)三、个人的实现观感一、背景 本文描
    2022-05-13
  • 利用Java编写一个属于自己的日历

    利用Java编写一个属于自己的日历

    目录问题提出一点提示源码分享问题提出 编写程序,输入年份,打印出该年的年历(12个月的),效果如下图所示。 一点提示 使用 Java 自带的
    2022-05-13
  • centos安装ElasticSearch教程

    centos安装ElasticSearch教程

    CentOS7.9-ES7 部署下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.11.2-linux-x86_64.tar.gz解压tar -zxvf elasticsearch-7.11.2-linux-x86
    2022-05-13
  • Nevercenter Silo Pro(3D多边形建模) 2022.0 beta 2 x64 破解版 附激活教程

    Nevercenter Silo Pro(3D多边形建模) 2022.0 beta 2 x64 破解版 附激活教程

    Nevercenter Silo Pro(3D多边形建模) 2022.0 beta 2 x64 破解版 附激活教程,Nevercenter Silo Pro 2022激活版是一款轻量级、闪电般快速的 3D 多边形建模器和 UV 映射器,以极其实惠的价格提供深度的工业级工具集和易于掌握的工作流程。其轻巧、专注和便携的特性使其成为十多年来的首选纯建模器
    2022-04-14

最新评论