专栏首页技术面面观go中的接口与多态

go中的接口与多态

小熊不小心把自己的电脑刷成砖了。哭了。。

本来想格式化下盘,谁知道格式化完以后啥都没有,连系统都没了,几乎和 rm -rf / 有得一拼!

按官网给的方法试了,启动 u 盘制作不成功,制作成功了识别不出来,尝试网络恢复发现只能连美国的服务器,好不容易连上了,等了两个小时结果无法验证 OS !

搞了两天到现在都没搞定,只能等明天再背去公司试试了。

今天和大家聊聊 golang 的接口( interface

接口

接口同 java 一样,可以把一堆有共性的方法定义在里面,但是比 java 灵活的是,不需要显式实现接口,你可以自己控制实现哪些方法。

不需要显式实现的意思是,不需要像 java 那样 implements interface 写出来,别急,看完下面的例子就知道了。

定义一个接口。

type humanInterface interface {
 eat() string
 play() string
}

定义一个结构体(类)

type man struct {
 name string
}

实现接口,语法和 给结构体添加方法 一样,完全看不出来 接口 的身影。

func (p man) eat() string {
 return "eat banana"
}

func (p man) play() string {
 return "play game"
}

上面的代码给结构体添加了和接口一样的方法,只要完全实现接口中的方式,默认这就实现接口(隐式)。

用下面这样的格式,把结构体赋值给接口来实现他接口实例 = new(类型)

var human humanInterface
human = new(man)
fmt.Println(human.eat())
fmt.Println(human.play())

输出

eat banana
play game

PS: new 关键字和 c++ 中的不同,释放内存由 go 的垃圾处理机来做,不需要自己释放内存。

这不是接口

上面的是一个很简单实现接口的例子。要注意的是,必须实现了所有接口的方法才算是实现了这个接口。

假如我们只实现了接口中的一个方法,会发生什么事?

type dogInterface interface {
 eat() string
 play() string
}

type dog1 struct {
 name string
}

func (d dog1) eat() string {
 return "Eat dog food"
}

var dog dogInterface
dog = new(dog1)

报错

报错:Cannot use 'new(dog1)' (type *dog1) as type dogInterface in assignment
Type does not implement 'dogInterface' as some methods are missing: play() string more...

多态

当然,多态是面向对象的灵魂, go 怎么能没有?

这是一个以接口为参数的函数,方法内调用了接口中方法。

func humanDoWhat(p humanInterface) {
 fmt.Println(p.eat())
 fmt.Println(p.play())
}

传入不同的类(结构体)

w := woman{"lisa"}
m := man{"coding3min"}
// 多态的含义就是不需要修改函数,只需要修改外部实现
// 同一个接口有不同的表现
humanDoWhat(w)
humanDoWhat(m)

不同输出

lisaeat rice
lisawatch TV
coding3mineat banana
coding3minplay game

java 中的多态有三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

但是 go 没有继承、重写, go 作为一种优雅的语言, 给我们提供了这种解决方案,那就是鸭子类型:看起来 像鸭子, 那么它就是 鸭子

周末愉快~ 希望我的电脑我能自己弄好。

本文分享自微信公众号 - 编程三分钟(coding3min),作者:小熊爱编程

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 三分钟学 Go 语言——常量+各种类型转换

    不过要枚举还是用 go 自带的特殊常量好一点,这种特殊被认为是可以被编译器修改的常量

    机智的程序员小熊
  • 让你的Golang项目在IDE里跑起来(Goland使用入门-GOROOT、GOPATH、src、 pkg、bin...)

    每次新建项目,不熟悉go的项目结构,一般跑都跑不起来,每次都要重新搞一遍,好几回跑项目都会报类似File is invalid的错误

    机智的程序员小熊
  • 三分钟手操自己的yum源

    上次就想手操yum源了,考虑到有的朋友没接触过,直接写成了yum源的科普,活活憋了我一个星期,现在我们快快开始。

    机智的程序员小熊
  • interface引发的事件真相

    流动的水没有形状,漂流的风找不到踪迹,一切代码都了然于心,我们在写代码的时候,总是有一种思维定式陪伴左右,在对事物做判断的时候,往往这种思维定式会往正向或反向做...

    李海彬
  • 手写ORM入门篇(一)

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编...

    指尖改变世界
  • caffe详解之卷积层

    上图取自CS231n,展示了三维卷积的计算过程,输入数据的三个维度,对应第二个卷积核生成了第二个Feature Map

    AI异构
  • 实验4 差异可视化之星图

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wpxu08/article/details/8938...

    步行者08
  • 遇到这些 TS 问题你会头晕么?

    相信很多读者看到 let value: Fonum = 12; 这一行,TS 编译器并未提示任何错误会感到惊讶。很明显数字 12 并不是 Fonum 枚举的成员...

    阿宝哥
  • 警车在巡逻时意外拍到了流星划过夜空 双子座流星雨正处于高峰期

    随着行车记录仪的普及,我们很容易捕捉到一些转瞬即逝的场景。而在双子座流星雨处于巅峰的当下,夜间巡逻的警员们,显然最有机会欣赏到流星划过夜空的美景。

    Zip
  • Node.js 项目 TypeScript 改造指南(二)

    最近笔者把一个中等规模的 Koa2 项目迁移到 TypeScript,和大家分享一下 TypeScript 实践中的经验和技巧。

    WecTeam

扫码关注云+社区

领取腾讯云代金券