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

  在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. 经典sql面试题(学生表_课程表_成绩表_教师表)

    转载:https://www.cnblogs.com/qixuejia/p/3637735.html 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna ...

  2. 02 jQuery中的事件、动画、复合函数

    jQuery中的事件 在JavaScript中,常用的基础事件有鼠标事件.键盘事件.window事件.表单事件.事件绑定和处理函数的语法格式如下 语法q 事件名 = "函数名()" ...

  3. LNMP 源码发布Thinksaas论坛

    第一步:搭建LNMP架构 LNMP架构 注意:搭建php服务时,初始化 ./configure --prefix=/usr/local/php5 \ --enable-fpm \ --enable-d ...

  4. 微信小程序setData复杂数组的更新、删除、添加、拼接

    众所周知,微信小程序里所有对数据的修改只有在setData里修改才会在页面上渲染.在此分享小程序里复杂数组的更新.删除.添加.拼接 初始数据 数组嵌套对象 data: { cartList = [{ ...

  5. CSS+HTML实现移动端div左右滑动展示

    由于手机屏幕的宽度有限,内容太多移动设备一行装不下的,所以很多移动端网站的导航栏都有左右滑动效果,下面我就用CSS+HTML实现移动端div左右滑动展示. CSS:box设置文本不换行,子元素box1 ...

  6. 谈一谈个人利用Java的mysql的知识完成的数据库的项目-----用户信息管理系统

    首先,我先简述一下自己做的过程啊,相信大家来找这样的博客,也都是为了完成自己课程任务吧.我也一样是一名大一的学生,是为了自己的课程任务而开始做数据库的项目的.因为还没学mysql吗,所以是自己找视频啊 ...

  7. Vue + TypeScript 踩坑总结

    vue 和 TypeScript 结合的情况下,很多写法和我们平时的写法都不太一样,这里总结我项目开发过程中遇到的问题和问题的解决方案 有些问题可能还没解决,欢迎各位大佬给与提点. 另外,使用本文前可 ...

  8. MySQL 8.0新增特性详解【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. mysql数据库命令

    删除一个表: drop table if exists 表名; 在表中插入行: Insert into 表名 values(, , ,) 创建表: Create table 表名( Id int(10 ...

  10. luogu P1356 数列的整数性 |动态规划

    题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5,-2,-15,那么就可以构 ...