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

  在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. PHP中16个高危函数

    php中内置了许许多多的函数,在它们的帮助下可以使我们更加快速的进行开发和维护,但是这个函数中依然有许多的函数伴有高风险的,比如说一下的16个函数不到万不得已不尽量不要使用,因为许多“高手”可以通过这 ...

  2. 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍

    例句: Jane wants to go to Shenzhen. Bob  wants to go to Shanghai. 一.词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个 ...

  3. 【NOIP2017】【Luogu P3956】【SPFA】棋盘

    Luogu P3956 本题是一道简单的SPFA 具体看程序 #include<iostream> #include<cstdio> using namespace std; ...

  4. java中的运算,+-* /% | ^ &

    java中运算都是操作符号,那么整形默认为int,双精度默认为都double 整数 看案例: 无法编译通过:操作默认为int,接受结果为int,所以这个地方编译无法通过,所以需要强制类型转换 再看案例 ...

  5. day 26 约束、自定义异常、加密hashlib、logging

    一.约束 建议使用: class BaseMessage(object): def send(self): """ 必须继承BaseMessage,然后其中必须编写sen ...

  6. 全球 43 亿 IPv4 地址已耗尽!IPv6,刻不容缓

    大家都知道目前网络协议使用的主要是 IPv4,全称为 Internet Protocol version 4,作用是为每一个网络和每一台主机分配一个 IP,IP 地址是一个 32 位的二进制数,算下来 ...

  7. Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time

    启动Tomcat服务器时经常遇到这个错误, Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the ser ...

  8. maven中的setting文件

      localRepository默认jar包下载到本地哪个目录下 pluginGroups 把自己的插件放在这里进行管理 这样不用写groupId和artifactId     一个生命周期包含很多 ...

  9. PHP 获取服务器详细信息的原生方法

    获取系统类型及版本号:    php_uname()     (例:Windows NT PCA15130 6.1 build 7601 (Windows 7 Ultimate Edition Ser ...

  10. css4——浮动

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...