一、类型方法的实例成员复制与类型方法的实例成员引用

  在Go中可以类似Java等面向对象语言一定为某个对象定义方法,但是Go中并没有类的存在,可以不严格的将Go中的struct类型理解为面向对象中的类;

type demoObject struct {
id int
}

  类的概念有了,那怎么为这个类(struct结构)定义方法呢;Go语言中有两种方式:

1、在类型指针上定义方法;

func (o *demoObject) one() {
fmt.Printf("one方法字段的内存地址:%x\n",
unsafe.Pointer(&o.id))
}

2、在类型上定义方法;

func (o demoObject) two() {
fmt.Printf("one方法字段的内存地址:%x\n",
unsafe.Pointer(&o.id))
}

  这两种方式其实定义方式都差不多,区别只是在于方法时定义在类型上还是定义在类型指针上面,就是因为这点区别导致了方法中类型实例有了本质的区别;

  在类型上定义方法其类型实例的成员值会进行复制,也就是说每个该类型实例的方法中类型的成员地址也都不一样;

  而在类型指针上定义方法其类型实例的成员只是指针复制,所有类型指针上方法的类型成员地址完全一样;

var obj = new(demoObject)
fmt.Printf("main函数obj对象字段的内存地址:%x\n",
unsafe.Pointer(&obj.id))
obj.one()
obj.two()

  one方法:o实例的成员id内存地址与obj实例的成员id地址一样

  two方法:o实例的成员id内存地址与obj实例的成员id地址不一样

总结来说:

  one方法中修改demoObject类型的成员id的值obj实例成员id值也会变化

  two方法中修改demoObject类型的成员id的值obj实例成员id值不会变化

二、接口与实现

  在Go中实现某接口不需要显式的依赖该接口,只需要在某类型或类型指针上定义与该接口的方法签名完全一致的接口即可;

type inter interface {
hello()
}
func (o *demoObject) hello() {
}
var i inter = new(demoObject)
i.hello()

  如上代码所示,即可说类型demoObject实现了inter接口,Go的接口具有非入侵性,由于该特性因此Go语言也具有了dock typing ,也就是鸭子类型;

三、内嵌类型(类似继承并非等同于Java中的继承)

  Go中存在这一种匿名内嵌类型,通过匿名内嵌类型可以得到类似与继承的结果;

type base struct {
Id int
}
type level struct {
*base
}
var l=new(level)
fmt.Println(l.Id)

  如上代码所示,通过在类型level中引入匿名内嵌类型base,可以使用level类型的实例l调用得到类型base中的成员Id,如果base类型有绑定方法level类型实例一样可以调用该方法。

  请注意上面说的是通过内嵌类型可以得到的是类似继承,并非等同于继承,level实例虽然可以访问得到base类型实例,但并不能在level中重写base的方法。两者并非继承与被继承的关系;

四、Go中的多态

  Go有接口的存在,是否也存在多态的概念呢。 答案是存在的如下代码所示,与Java中的多态并没有很大区别;

type one struct{}
type two struct{}
type inter interface {
hello()
}
func (o *one) hello() {
fmt.Println("one hello")
}
func (t *two) hello() {
fmt.Println("two hello")
}
func say(i inter) {
i.hello()
} var o = new(one)
var t = new(two)
say(o)
say(t)

  Golang中存在面向对象的某些特征,但又与传统的面向对象语言有着不小区别;如Go中只有类似继承功能,又不等同于其他语言的继承,无法重写方法,也不存在子类于父类的概念;Go中存在接口但空接口代表着是任意类型于Java中的Object类类似但又不一样;

Golang中类面向对象特性的更多相关文章

  1. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  2. .NET面向对象特性之“继承”

    整体简介 1.理解继承——继承关系图 2.实现继承与接口多继承 3.new. virtual.override方法 4.抽象方法和抽象类的继承 5.继承的本质 6.继承的复用性.扩展性和安全性 7.多 ...

  3. Objective-C的面向对象特性(一)

    Objective-C在c语言的基础上增加了面向对象特性,都有哪些面向对象特性呢? 其中第一个最重要的特性是类和对象的实现. Objective-C软件由许多对象构成,形成一个对象网络,对象之间通过发 ...

  4. 【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是 ...

  5. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  6. 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    [游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态   阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...

  7. golang之面向对象编程

    1.Golang语言面向对象编程说明 1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.所以我们说Golang支持面向对象编程特性是比较准确的. ...

  8. Golang的面向对象编程【结构体、方法、继承、接口】

    Golang也支持面向对象编程.但与以前学过传统的面向对象编程语言有区别.1)Golang没有类class,Go语言的结构体struct和类class有相似的特性.2)Golang中不存在继承,方法重 ...

  9. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

随机推荐

  1. Swoft 源码剖析 - Swoole和Swoft的那些事 (Http/Rpc服务篇)

    前言 Swoft在PHPer圈中是一个门槛较高的Web框架,不仅仅由于框架本身带来了很多新概念和前沿的设计,还在于Swoft是一个基于Swoole的框架.Swoole在PHPer圈内学习成本最高的工具 ...

  2. D^3ctf两道 pwn

    这次 的D^3ctf 又是给吊打 难顶... 所以题都是赛后解出来的,在这感谢Peanuts师傅 unprintableV 看看保护: 看看伪代码,其实代码很少 void __cdecl menu() ...

  3. gulp 自动化构建html项目--自动刷新

    使用gulp自动化构建项目是前端学习的重要部分,gulp依赖于node.js.首选电脑要配置node和npm. 查看node版本号 node --version 查看npm 版本 npm --vers ...

  4. Java流程控制之(四)中断

    目录 break continue return 标签 在程序设计时,循环直接的跳转显得十分重要,虽然Java没有提供goto语句去控制程序的跳转,但为了控制循环,Java提供了continue,br ...

  5. 基于xtrabackup实现mysql备份还原

    简介 Xtrabackup2.2版之前包括4个可执行文件: innobackupex: Perl 脚本 xtrabackup: C/C++ 编译的二进制 xbstream: 支持并发写的流文件格式 x ...

  6. 解决maven创建过慢问题和快捷键

    archetypeCataloginternal idea常用的快捷键 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ct ...

  7. Java基础面试题及答案(五)

    Java Web 64. jsp 和 servlet 有什么区别? jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器 ...

  8. C# 异步并发操作,只保留最后一次操作

    在我们业务操作时,难免会有多次操作,我们期望什么结果呢? 绝大部分情况,应该是只需要最后一次操作的结果,其它操作应该无效. 自定义等待的任务类 1. 可等待的任务类 AwaitableTask: // ...

  9. Linux查看系统基本信息、版本信息等

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号 1.uname -a   (Linux查看版本当前操作系统内核信息) 2.cat /proc/version (L ...

  10. sql语句查询结果合并union all用法_数据库技巧

    --合并重复行 select * from A union select * from B --不合并重复行 select * from A union all select * from B 按某个 ...