(三十)golang--面向对象
首先我们要明确:
- golang并不是纯粹的面向对象的编程语言;
- golang没有类class,使用struct代替;
- golang面向对象编程非常简洁,去掉了传统的继承、重载、构造函数和析构函数、隐藏的this指针等;
- golang仍然有面向对象编程的继承、封装和多态的特性,只是实现的方法和其他oop语言不一样;
- golang耦合性低,非常灵活;面向接口编程是非常重要的特性;
从这可以看出,结构体其实是我们自己定义的数据类型;结构体变量是具体的,实际的,代表一个具体变量;
申明结构体的几种方式:
- var person Person
- var person Person = Person(“Tom”,20)
- var person *Person = new(Person)
- var person *Person = &Person()
结构体类型内存的分配机制:
可以看出,各结构体之间是相互不影响的。
这种方式则p2是一个指针,指向p1,修改p2的值会同时修改p1的值。
结构体的使用细节:
- 结构体的字段是在内存中连续的;
对于第二种指针,在内存中的示意图:
首先,绿色块四个数据的的地址是连续的,然后两个绿色块的地址是连续的,也就是红色框中的地址,而指向红色框的地址是不连续的,相差16?
- 结构体是用户自己定义的类型,和其它类型进行转换需要完全相同的字段名;
- 结构体进行type重新定义(相当于取别名),golang认为是新的数据类型,但是可以强转;
- 在结构体的字段上,还可以取一个标签tag,该tag可以通过反射机制获取,常见的使用场景是序列化和反序列化;
将输出转换成了小写。
方法:作用在指定数据类型上的,因此,自定义数据类型,也可以有方法。
这里test方法是针对于Person类型绑定;test方法只能通过Person类型的变量来调用;这里方法里面的p相当于是一个形参;
方法的声明:
func (recevier type) methodName(参数列表) (返回值列表){
方法体
return 返回值
}
使用事项:
- 结构体类型是值类型;
- 如果一个变量实现了string方法,那么fmt.Println默认会调用这个变量的String进行输出;
方法和函数的主要区别:
(1)在调用时的区别,变量.方法名
(2)函数只能接受与之对应的值类型或者引用类型;
(3)方法既可以接受引用类型,也可接受值类型,因为底层会对其做一个优化;主要是看和什么类型进行拷贝的;
(三十)golang--面向对象的更多相关文章
- Python学习札记(三十四) 面向对象编程 Object Oriented Program 5
参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...
- 第三十篇 面向对象的三大特性之继承 supre()
继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和 多继承. # 定义父类 class ParentClass ...
- Python学习札记(三十九) 面向对象编程 Object Oriented Program 10
参考:使用枚举类 NOTE #!/usr/bin/env python3 from enum import Enum def main(): Mouth = Enum('Mouth', ('Jan', ...
- Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...
- Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__
参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...
- Python学习札记(三十五) 面向对象编程 Object Oriented Program 6
参考:实例属性和类属性 NOTE Python是动态语言,根据类创建的实例可以任意绑定属性. class Student(object): def __init__(self, name): self ...
- Python学习札记(三十二) 面向对象编程 Object Oriented Program 3
参考:访问限制 NOTE 1.eg. #!/usr/bin/env python3 class Student(object): """docstring for Stu ...
- “全栈2019”Java第三十五章:面向对象
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- JS基础入门篇(三十五)—面向对象(二)
如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)
- Web 开发人员和设计师必读文章推荐【系列三十】
<Web 前端开发精华文章推荐>2014年第9期(总第30期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- php 截取字符串 strstr 和strrchr
截取字符串 strstr 和strrchr 结果:(其中之一) strstr : 执行时间在0.10 - 0.19 之间 strrchr : 执行时间在0.095 - 0.19 之间 结论:从数十次执 ...
- 前端笔记之React(七)redux-saga&Dva&路由
一.redux-saga解决异步 redux-thunk 和 redux-saga 使用redux它们是必选的,二选一,它们两个都可以很好的实现一些复杂情况下redux,本质都是为了解决异步actio ...
- hive引擎的选择:tez和spark
背景 mr引擎在hive 2中将被弃用.官方推荐使用tez或spark等引擎. 选择 tez 使用有向无环图.内存式计算. spark 可以同时作为批式和流式的处理引擎,减少学习成本. 问题& ...
- 人生苦短?试试Groovy进行单元测试
如果您今天正在编程,那么您很可能听说过单元测试或测试驱动的开发过程.我还没有遇到一个既没有听说过又没有听说过单元测试并不重要的程序员.在随意的讨论中,大多数程序员似乎认为单元测试非常重要. 但是,当我 ...
- TCP协议 - 面向连接
一.TCP特性概览 1.面向连接 TCP是基于连接进行数据交互,通信双方在进行数据交互之前需要建立连接,该连接也只能用在双方之间进行交互.这点不像UDP中的组播和广播,可以在同一组中多个主机交互数据. ...
- 【linux】dmesg命令显示开机信息和设备加载情况
Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息亦保存在/var/log目录中,名称为dm ...
- ros相关笔记
catkin_make不编译某些package https://answers.ros.org/question/54181/how-to-exclude-one-package-from-the-c ...
- JDK1.8新特性——使用新的方式遍历集合
JDK1.8新特性——使用新的方式遍历集合 摘要:本文主要学习了在JDK1.8中新增的遍历集合的方式. 遍历List 方法: default void forEach(Consumer<? su ...
- 做一个vue轮播图组件
根据huangyi老师的慕课网vue项目跟着做的,下面大概记录了下思路 1.轮播图的图 先不做轮播图逻辑部分,先把数据导进来,看看什么效果.在recommend组件新建一个recommends的数组, ...
- postgreSQL数据库的初探
kali是黑客的强大武器,还有一个也是哦——Metasploit postgreSQL数据库是Metasploit的默认数据库哦! 启动postgresql: service postgresql s ...