Go语言学习笔记(3)——面向对象编程
把存货赶紧更新一波(捂脸)
1. 类型系统
类型系统,就是说一种编程语言怎么设计的它的类型的体系结构。
比如基础类型啊,复合类型啊,一些可以指向任意对象的类型啊,以及类型的语义,面向对象的特性,接口,这些内容。
2. 类型的方法
在Golang里,可以给任意类型添加方法。
比如:
type Integer int func (i Integer)Less (b Integer) bool {
return a<b
}
Integer与int没有本质的不同。我们声明了一个属于Integer的函数Less()。这样我们就可以把整型当作普通的类来使用:
func main() {
var a Integer = 1
if a.Less(2) {
fmt.Println(a, "Less 2")
}
}
那么类型的方法到底是什么呢?我们把刚才的Less()和下面的方法做个对比:
func NewLess(a Integer, b Integer) bool {
return a<b
}
这里,我刻意没有把a和b写在一起。对比刚才的Less()方法,我们发现,所谓的类型方法,关键在于隐藏的this指针。如果我们把类型a放到传递参数的部分,我们就发现这两个函数并没有区别。
如果我们需要在类型方法中对类型的实例本身进行修改,那么在声明的时候,就需要声明成指针。这也很好理解,就跟传递参数的时候传递指针是一样的道理。
func (i *Integer)Less (b Integer) bool {
return a<b
}
关于成员函数,再加一个例子
type T struct {
num int
} func (t T) add1() {
t.num += 5
} func (t *T) add2() {
t.num += 5
} func main() {
t1 := T{5}
t2 := &T{5}
fmt.Println(t1)
fmt.Println(t2)
t1.add1()
fmt.Println(t1.num)
t1.add2()
fmt.Println(t1.num)
t2.add1()
fmt.Println(t2.num)
t2.add2()
fmt.Println(t2.num)
}
其结果如下:
shell> go run main.go
{5}
&{5}
5
10
5
10
3. 值语义和引用语义
值语义和引用语义的区别主要在于赋值。
b = a
b.Modify()
如果此时a没有变化,就是值类型,反之是引用类型。
Golang中大部分类型都是值类型。
所以只要记住引用类型即可。他们是切片,map,channel和接口。
4. 结构体和结构体的初始化
结构体struct跟其他语言的struct和class差不多。不过golang没有传统意义上的继承。
type Rect struct {
x, y float64
width, height float64
}
struct的实例的初始化方法如下:
rect1 := new(Rect)
rect2 := Rect{}
rect3 := Rect{0, 0, 100, 200}
rect4 := Rect{width: 100, height: 200}
需要注意的是,没有显式初始化的成员都会初始化为该类型的0值。
另外golang中没有构造函数的概念。如果需要类似的构造函数,通常是创建一个全局函数进行新对象的创建。
5. 结构体的组合
前面提到golang并没有传统意义上的继承,但是,golang提供了组合。
type Base struct {
Name string
} func (base *Base) Foo() {...}
func (base *Base) Bar() {...} type Foo struct {
Base
...
} func (foo *Foo) Bar() {
foo.Base.Bar()
...
}
可以看到,上面的代码定义了一个Base类,实现了Foo()和Bar()两个方法。然后定义了一个Foo类,该类中组合了Base类。
从形式了,Foo类“继承”了Base类,并改写了Bar()方法,同时在Bar()方法中调用了Base基类中的Bar()方法。
对于没有被改写的方法,就相当于是被“继承”了,同时仍然可以通过组合的类型来访问方法。比如,foo.Foo()和foo.Base.Foo()的效果是一致的。
6. 可见性
跟前面提到的相同,golang使用首字母大小写区别public和private。
7. 接口
Golang中的接口是非入侵式的。一个类只要实现了接口要求的所有函数,这个类就实现了该接口。
未完待续
Go语言学习笔记(3)——面向对象编程的更多相关文章
- javascript 学习笔记之面向对象编程(一):类的实现
~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- javascript 学习笔记之面向对象编程(二):继承&多态
~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...
- 【c# 学习笔记】面向对象编程的应用
在平时的开发过程中,面向对象编程的应用肯定必不可少.但前面的内容只是单独介绍了类.面向对象思想和接口,那么我们怎么在平时工作中来应用他们来实现面向对象编程呢? 如果你想设计一个Dog类,有了类的概念后 ...
- JavaSE学习笔记05面向对象编程01
面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...
- C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- Spark学习笔记11面向对象编程
面向对象编程 11.1 object类 11.1.1定义一个简单的类 11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- python学习笔记(七):面向对象编程、类
一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...
随机推荐
- 使用ThreadLocal
使用ThreadLocal 阅读: 135212 多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程.例如,打 ...
- springboot 启动jar正确方式
首先需要pom.xml配置一个插件: IDEA 在右侧执行顶上m图片按钮 在command Line 中执行clean package命令 执行打包注意 打完jar包后最好解压jar查看一下META- ...
- SalesForce学习——权限管理
Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...
- 【JavaWeb】书城项目
书城网站 项目说明 项目地址 阶段一 登录.注册的验证 使用 jQuery 技术对登录中的用户名.密码进行非空验证: 使用 jQuery 技术和正则表达式对注册中的用户名.密码.确认密码.邮箱进行格式 ...
- ArrayList源码解析--值得深读
ArrayList源码解析 基于jdk1.8 ArrayList的定义 类注释 允许put null值,会自动扩容: size isEmpty.get.set.add等方法时间复杂度是O(1): 是非 ...
- Docker学习笔记之向服务器部署应用程序
部署的应用仅仅是简单应用程序,使用的是node管理的web应用,具体我也不是很会,当然也可以配置tomcat服务器.这里主要是学习docker.需要客户机和服务机,其中服务机必须要为Linux操作系统 ...
- 【ORA】ORA-00257 archiver error. 错误的处理方法
今天连接数据库,结果报错,ora-00257查看 [oracle@exam oracle]$ oerr ora 00257 00257, 00000, "archiver error. Co ...
- 主题模型值LDA
主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型. 主题模型主要被用于自然语言 ...
- 安装jdk-windows系统
1. 明确需要安装的jdk版本,注意jdk存在小版本号,例如jdk1.7_51,如果不清楚小版本号的话建议安装最新版本的jdk: 2. 打开cmd命令窗口,输入java -version查看本机是否安 ...
- response返回特性
1. response 返回特性 r=requests.get("http://www.baidu.com")print(r.text) #打印返回正文print(r.status ...