go语言面向对象编程之类型系统
go语言类型系统
类型系统,顾名思义是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容
- 基础类型:如byte,int,bool,float等
- 复合类型:如数组,指针,结构体
- 可以指向任意类型的类型(Any类型)
- 值语义和引用语义
- 面向对象
- 接口
类型系统是描述这些内容在一个语言是如何关联的,Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法,在需要的时候,你可以给任何类型增加新的方法,而在实现某个接口的时候也不需要从该接口继承,只需要实现该接口的所有的方法即可。任何类型都可以被Any类型引用,Any类型就是空接口,即interface{},接下来我们对Go语言类型系统的特点做详细的讲解。
给类型添加方法
在Go语言中,你可以给任意类型(但是不包含指针类型)添加对应的方法,如下:
package main
import "fmt"
type Integer int
func (a Integer) Less(b Integer) bool{
return a < b
}
func main(){
var a Integer = 1
if a.Less(2){
fmt.Println(a,"Less 2")
}
}
在上面的例子中,我们定义了一个新的类型Integer,他和int没有本质的区别,只是他为内置的int类型增加了Less方法
在GO语言中,只有你需要修改对象的时候,才必须用指针,他不是go语言的约束,而是一个自然约束。举个例子
func (a *Integer) Add(b Integer){
*a += b
}
这个例子中为Integer类型增加了Add方法,由于Add方法需要修改对象的值,所以需要用指针引用,如果实现Add方法的时候传入的不是指针而是值,如下:
func (a Integer) Add(b Integer){
a += b
}
那么运行Add方法后,得到的仍然是a原来的值,就其原因,是因为Go语言是值传递的,要想修改变量的值,只能传递指针
值语义和引用语义
值语义和引用语义的差别在于赋值,比如下面的例子:
b = a
b.Modify()
如果b的修改不会影响a的值,那么此类型属于值语义,如果会影响到a的值,那么此类型是引用语义。
Go中大多数的类型都是基于值语义的,包含:
- 基本类型:如byte,int float等
- 复合类型: 如数组,结构体,指针等
Go语言中值语义表现的非常的彻底,我们之所以这么说,是因为数组
Go语言中的数组,和基本类型没有区别,是很u纳粹的值类型,例如:
var a = [3]int{1,2,3}
var b = a
b[1]++
fmt.Println(a,b)
运行结果如下:
[1 2 3] [1 3 3]
这表明b = a的赋值语句是,数组a的完全复制,要想表达引用需要使用指针
var a = [3]int{1,2,3}
var b = &a
b[1]++
fmt.Println(a,*b)
结果如下:
[1 3 3] [1 3 3]
结构体
go语言中的结构体和其他语言的class有同等的地位,但是go放弃了包括集成在内的大量面向对象的特性,之保留了组合这个最基本的特性。
Go的结构提只是很普通的复合类型,例如我们要定义一个矩形
type Rect struct{
x,y float
width,heigth float
}
我们还可以定义成员方法来计算矩形的面积
func (r Rect) Area() float{
return a.width * a.heigth;
}
go语言面向对象编程之类型系统的更多相关文章
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
- Swift2.0语言教程之Swift2.0语言中的标准函数
Swift2.0语言教程之Swift2.0语言中的标准函数 Swift2.0中的标准函数 函数除了可以根据参数列表的有无分为无参函数和有参函数,还可以从定义角度分为用户自定义函数和标准函数两种.以上的 ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- python基础-面向对象编程之组合
面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...
- Python3 面向对象编程之程序设计思想发展
概述 1940年以前:面向机器 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语 ...
随机推荐
- tiny4412 --Uboot移植(5) DDR3内存
开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...
- 移值UCOS2到M4核与M3核的区别
之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...
- Git多账号配置,同一电脑多个ssh-key的管理
为什么有这种需求? 在我们开发过程中,可能会遇到使用同一台机器,既要向公司git服务器提交代码,也要向gitlib或者gitee等 git仓库提交代码,2个仓库设置的用户名信息,不一样,此时需要用到多 ...
- 7C - 折线分割平面
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input ...
- 图解Golang的GC算法
虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了. 以下是Golang GC算法的里程碑: v1.1 STW v1.3 Mar ...
- Vb6调用C#生成的dll
namespace ClassLibrary1 { [ClassInterface(ClassInterfaceType.AutoDispatch)] //注意这行,这行是关键 pub ...
- Finance API文档
0. 公共部分 请求url {apiRoot}/{method}?ver={version}&appkey={appkey}&sign={sign} 参数名 说明 示例 apiRoot ...
- 从零开始学java(二)类与对象
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为. 类是对象的抽象,对象是类的具体实例. 1.构造一个类,让其拥有属性和方法 ...
- py3.0第四天 函数,生成器迭代器等
1.列表生成式,迭代器&生成器 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 > ...
- 开发HR人事考试系统介绍
确定好需要开发的模块以及功能 一套人事考试系统主要模块: 1)组织管理:公司部门成员信息 2)人事管理:人事信息,离职管理,职务管理,岗位管理: 3)考勤管理:班次设置,停工放假,假日设置,刷卡记录, ...