1、说明

和流行的面向对象语言不同,go 中没有面向对象的说法,也没有对应的封装、继承和多态,也许 go 的设计就不是和OOP对齐,想使用OOP,那就去用 Java 或者 C++ 吧。

但是,没有不表示 go 不能,我们仍然可以拐着弯地去使用

比如封装,可以用结构体模拟;继承可以使用接口和嵌套结构体,多态有些麻烦,前两者结合也可以实现

2、多态

程序设计中有一种风格鸭式辩型,javascript 里面常用,大概意思就是,走路像鸭子,叫起来像鸭子,那么它就是一只鸭子

把它放到 go 中,尽管没有多态,但是能实现多态相同的用法,那它就是多态

3、代码示例

我们用手机举例子,现在有多款手机,都能打电话(call()),但是打电话的内容不同,我们要能实现动态地切换不同手机打电话

放在 C++/java 中,这个功能很容易实现,只需要创建一个基类 Phone,然后不同手机的子类继承 Phone,实现 call() 方法即可,go 中,使用以下方式实现

示例:

type PhoneData struct {
name string
} type Phone interface {
call()
}

Phone 定义接口,后面需要实现这个接口,PhoneData 则表示各个手机都有的属性(这里是name)

type IPhone struct {
PhoneData
} func (phone *IPhone) call() {
fmt.Printf("%s call\n", phone.name)
}

定义 IPhone,实现 call() 方法

type HWPhone struct {
PhoneData
} func (phone *HWPhone) call() {
fmt.Printf("%s call", phone.name)
}

定义 HWPhone,实现 call() 方法

func getPhone(name string) Phone {
switch name {
case "iphone":
phone := new(IPhone)
phone.name = "iphone"
return phone
case "hwphone":
phone := new(HWPhone)
phone.name = "hwphone"
return phone
default:
fmt.Println("no phone")
}
return nil
}

对象工厂,根据参数,获取不同的手机

func main() {
var phone Phone
phone = getPhone("hwphone")//输出hwphone call
phone.call()
}

调用处,这里的的 phone 变量执行的 call() 方法,可以能是 IPhone,也可能是 HWPhone

4、总结

每种语言都有它的优势和劣势,go 可能设计之初就不是基于 OOP,强行按照 OOP 的思路写 go 到底是正途还是歪门邪道,我也不知道。写惯了 OOP 的人,即使换一种语言总喜欢用 OOP 的思路去套用,果然,思维的转换才是最难的

还是需要学习啊!!!

在Golang中实现多态的更多相关文章

  1. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

  2. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...

  3. Golang | Go语言多态的实现与interface使用

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第11篇文章,我们一起来聊聊golang当中多态的这个话题. 如果大家系统的学过C++.Java等语言以及面向对象的 ...

  4. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  5. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  6. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  7. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  8. C#中区别多态、重载、重写的概念和语法结构

    C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...

  9. 转载:C#中的多态

    原文地址 http://www.cnblogs.com/jhxk/articles/1644018.html  感谢博主分享! 之前看到过类似的问题:如果面试时主考官要求你用一句话来描述多态,尽可能的 ...

  10. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

随机推荐

  1. springboot项目全局异常处理@ControllerAdvice(方式二)

    SpringMVC 中 @ControllerAdvice 注解的三种使用场景!   @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义 ...

  2. rabbitMq消息持久化机制,和延时队列

    1.RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢? 消息持久化.可以将Queue,Exchange,Message都设置为可持久化的.为了保证RabbitMQ在退出,服务重 ...

  3. 阿里云 X 森马 AIGC T恤设计大赛开启! 穿什么由你定,赢Airpods,作品定制联名T恤

    "关于宇宙,我所知道的最富诗意的事实之一就是, 我们身体中的每一个原子都曾经存在于某一颗爆发的恒星里. 组成你左手的原子和组成你右手的原子 很有可能来自不同的恒星, 而我们都是恒星的孩子, ...

  4. 无法连接uniCloud本地调试服务,请检查当前客户端是否与主机在同一局域网

  5. Vue3.0 + Element Plus整合实战

    mall-vue3-manage 基于vue3.0 + Element Plus. 整合最新的 Echarts5 强劲的渲染引擎.富文本编辑器 Wangeditor 的后端管理项目. 版本 vue 3 ...

  6. freeswitch的mod_xml_curl模块动态获取configuration

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取acl配置. 环境 centos:CentOS  r ...

  7. html监听标签的resize

    <html> <body> <div id="div1" style="width:100%;height:100%;"> ...

  8. Linux-用户管理-useradd-userdel-id

  9. [转帖]Oracle进程中的 LOCAL=NO 和 LOCAL=YES

    https://www.cnblogs.com/wjoyxt/p/3780860.html 我们在服务器上用sqlplus 连接数据库,在查看进程,会多出一条记录: oracle 16007 1600 ...

  10. [转帖]linux中的set -e 与set -o pipefail

    https://www.cnblogs.com/xingmuxin/p/8431970.html 1.set -e "Exit immediately if a simple command ...