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

  在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. ASP.NET Aries 高级开发教程:如何写WebAPI接口

    前提: 最近,有不少同学又问到,Aries里如何提供WebAPI接口? 针对这个问题,今天给顺路写个教程,其实呢,很简单的. 方式一:直接用WebService提供接口. 用这种方式,直接添加接口就可 ...

  2. 2018092609-2 选题 Scrum立会报告+燃尽图 02

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8683] 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名 ...

  3. IT人该如何未雨绸缪,不断提升自己的竞争力?同时尽量避免风险?

    人会慢慢变老,变老后精力,记忆力乃至身体会慢慢变差,这是无法逆转的自然规律.随之会产生的是对中年危机的忧虑乃至恐惧,比如担心能力精力不及年轻人,从而导致收入锐减乃至失业. 对此我有如下三点不解.第一, ...

  4. 联想Y7000,I5-9300H+Nvidia GTX 1050, kali linux的nvidia显卡驱动安装

    转载自,Linux安装NVIDIA显卡驱动的正确姿势 https://blog.csdn.net/wf19930209/article/details/81877822#NVIDIA_173 ,主要用 ...

  5. vue防抖节流之v-debounce--throttle使用指南

    最新封装了一个vue防抖节流自定义指令,发布到npm上,有用欢迎star,谢谢! npm地址:https://www.npmjs.com/package/v-debounce-throttle git ...

  6. 【新手向】如何学习Java集合

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 如果认识我的同学可能就知道,我已经写过很多系列级 ...

  7. 构建调试Linux内核网络代码的环境MenuOS系统

    构建MenuOS系统 1.将指定文件拷贝到本地: git clone https://github.com/mengning/linuxnet.git 此过程可能需要输入github账号和密码. 2. ...

  8. The place where I want to go

    The place where I want to go It’s hard to say where I want to go most. Because there are too many pl ...

  9. LNMP架构介绍、MySQL和PHP安装、Nginx介绍

     6月6日任务  12.1 LNMP架构介绍12.2 MySQL安装12.3/12.4 PHP安装12.5 Nginx介绍 扩展Nginx为什么比Apache Httpd高效:原理篇 http://w ...

  10. Netty学习——protoc的新手使用流程

    Netty学习——protoc的新手使用流程 关于学习的内容笔记,记下来的东西等于又过了一次脑子,记录的更深刻一些. 1. 使用IDEA创建.proto文件,软件会提示你安装相应的语法插件 安装成功之 ...