深入理解Go语言实现多态 

 更新时间:2022年05月13日 11:39:54   作者:ZZZhonngger  
本文主要介绍了Go语言实现多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

多态是什么

相信学过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语言无缓冲的通道的使用

    Go语言无缓冲的通道的使用

    Go语言中无缓冲的通道是指在接收前没有能力保存任何值的通道,本文主要介绍了Go语言无缓冲的通道的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 使用go xorm来操作mysql的方法实例

    使用go xorm来操作mysql的方法实例

    今天小编就为大家分享一篇关于使用go xorm来操作mysql的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • golang中按照结构体的某个字段排序实例代码

    golang中按照结构体的某个字段排序实例代码

    在任何编程语言中,关乎到数据的排序都会有对应的策略,下面这篇文章主要给大家介绍了关于golang中按照结构体的某个字段排序的相关资料,需要的朋友可以参考下
    2022-05-05
  • GO语言延迟函数defer用法详解

    GO语言延迟函数defer用法详解

    本文主要介绍了GO语言延迟函数defer用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang实践之Error创建和处理详解

    Golang实践之Error创建和处理详解

    在 C#、Java 等语言中常常使用 try...catch的方式来捕获异常,但是在Golang 对于错误处理有不同的方式,像网上也有很多对 error 处理的最佳实践的文章,其中很多其实就是对 error 的统一封装,使用规范进行约束,本文主要是记录自己对处理 Error 的一些认识和学习
    2023-09-09
  • GOLANG使用Context管理关联goroutine的方法

    GOLANG使用Context管理关联goroutine的方法

    这篇文章主要介绍了GOLANG使用Context管理关联goroutine的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • golang特有程序结构入门教程

    golang特有程序结构入门教程

    GO语言是一门不错的编程语言能够到达静态编译语言的安全和性能,在本文中重点给大家介绍goland特有程序结构及引用类型别名的特征,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • go通过benchmark对代码进行性能测试详解

    go通过benchmark对代码进行性能测试详解

    在开发中我们要想编写高性能的代码,或者优化代码的性能时,你首先得知道当前代码的性能,在go中可以使用testing包的benchmark来做基准测试 ,文中有详细的代码示例,感兴趣的小伙伴可以参考一下
    2023-04-04
  • Golang流程控制语句的具体使用

    Golang流程控制语句的具体使用

    在编写程序时,流程控制是必不可少的一部分,本文主要介绍了Golang流程控制语句的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Golang slice切片操作之切片的追加、删除、插入等

    Golang slice切片操作之切片的追加、删除、插入等

    这篇文章主要介绍了Golang slice切片操作之切片的追加、删除、插入等,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论