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. AtCoder Regular Contest 124

    比赛链接:Here A - LR Constraints 赛时做这个好迷啊,英文题面解释不清楚,还是看了日语原文才搞懂 \(n\) 个卡牌上有两个 字符 + 数字 组合,L 的右边所有元素 + 1,R ...

  2. Java23种设计模式学习笔记

    创建型模式:关注对象的创建过程 1.单例​模式: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 主要: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高, ...

  3. S3C2440移植uboot之支持DM9000

      上一节S3C2440移植uboot之支持NANDFLASH操作移植了uboot 支持了NANDFLASH的操作,这一节修改uboot支持DM9000. 目录 通过Makefile把dm9000x编 ...

  4. freeswitch两个DTMF转换接口的区别

    概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...

  5. C#语言 十大经典排序算法动画与解析!(动态演示+代码)(java改写成C# )

    以下内容是根据 https://www.cnblogs.com/fivestudy/p/10212306.html   进行改写 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法 ...

  6. 【日常踩坑】解决 kex_exchange_identification 报错

    目录 踩坑 原因分析 解决办法 1. 临时关闭代理 2. 修改代理软件配置,22 端口走直连 3. 改用 HTTPS 协议,走 443 端口 参考资料 踩坑 最近在使用 git 时,发现 git pu ...

  7. 第二届福州大学至诚学院网络安全大赛G0DCTF Misc WP

    MISC baby_misc 1.题目信息 key文件夹: 还有一张图片 2.解题方法 观察key文件夹里的每个文件信息,发现并无什么有用的,甚至有的为空... 看到文件名称的数字而且还给了图片,可以 ...

  8. [转帖]shell编程:变量的数值计算实践(五)

    https://www.cnblogs.com/luoahong/articles/9224495.html 算术运算符 变量的数值(整数)计算   1)(())用法:(此方法很常用)** 范例:sh ...

  9. [转帖]max_allowed_packet 与 SQL 长度的关系

    https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210013 适用版本:V2.1.x.V2.2.x.V3.1 ...

  10. [转帖]Oracle参数解析(parallel_force_local)

    https://www.modb.pro/db/122032 是否需要增加这个参数? 往期专题请查看www.zhaibibei.cn这是一个坚持Oracle,Python,MySQL原创内容的公众号 ...