一个典型的类型系统包括:
- 基础类型: byte, int, bool, float等
- 复合类型:数组,结构体,指针
- 可以指向任意对象的类型(Any类型)
- 值语义和引用语义
- 面向对象,即所有具备面向对象特征的类型
- 接口
在GO语言中可以为任意类型(包括内置类型)添加相应的方法
在GO语言中没有隐藏的this指针
1) 方法施加的目标显示传递,没有被隐藏起来
2) 方法施加的目标不需要非得是指针,也不用非得叫this
GO语言和C语言一样,类型都是基于值传递的,要想改变变量的值,只能在函数中传递指针。
1. 类型系统
1.1. 值语义和引用语义
值语义和引用语义的差别在于赋值
b = a
b.Modify()
如果b的修改不会影响a的值,那么此类型属于值类型。如果会影响a的值,那么此类型是引用类型。
GO语言中的大多数类型都属于值语义,包括:
基本类型: byte, int, bool, float32, float64和string等
复合类型: array, struct, pointer等
GO语言中的类型的值语义表现的非常彻底。
1.2. 结构体
GO语言放弃了包括继承在内的大量面向对象特性,只保留了组合这个最基础的特性。
组合不能算面向对象的特性,因为在C语言这样的过程式编程语言中,也有结构体,也有组合。组合只是形式复合类型的基础。
GO语言中结构体的使用方式与C语言并没有什么明显的不同。
2. 初始化
在GO语言中,未进行显式初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false, int类型的零值为0, string类型的零值为空字符串。
结构体有多种初始方法,如下:
确切的说,GO语言也提供了继承,但是采用了组合的文法,所以我们将其称为匿名组合
4. 可见性
GO语言对关键字的增加非常吝啬,没有private, protected, public这样的关键字。要使某个符号对其他包可见,需要将该符号定义为以大写字母开头。
5. 接口
GO语言的接口并不是其他语言中所提供的接口概念。JAVA现在的接口是侵入式接口, GO的接口时非侵入式的。
在GO语言中,一个类只要实现了接口要求的所有函数,我们就说这个类实现了该接口。
在GO语言中,接口赋值在GO语言中分为如下两种情况:
1. 将对象实例赋值给接口
2. 将一个接口赋值给另一个接口
有疑问加站长微信联系(非本文作者)