![3765f17bf93d3c0fd437d27c32d24e4e.png](https://img-blog.csdnimg.cn/img_convert/3765f17bf93d3c0fd437d27c32d24e4e.png)
1. 概述
类型系统是指一个语言的类型体系结构。
一个典型的类型系统通常包含如下基本内容:
- 基础类型,如byte、 int、 bool、 float等;
- 复合类型,如数组、结构体、指针等;
- 可以指向任意对象的类型(Any类型);
- 值语义和引用语义;
- 面向对象,即所有具备面向对象特征(比如成员方法的类型;
- 接口。
类型系统描述的是这些内容在一个语言中如何被关联。
在传统的面相对象编程语言中,比如Java,存在两套完全独立的类型系统:
- 值类型系统,主要是基本类型,如byte、int、 boolean、 char、double等,这些类型基于值语义;
- 以Object类型为根的对象类型系统,这些类型可以定义成员变量和成员方法,可以有虚函数,基于引用语义,只允许在堆上创建(通过使用关键字new)。
Java语言中的Any类型就是整个对象类型系统的根——java.lang.Object类型,只有对象类型系统中的实例才可以被Any类型引用。值类型想要被Any类型引用,需要装箱 (boxing)过程,比如int类型需要装箱成为Integer类型。另外,只有对象类型系统中的类型才可以实现接口,具体方法是让该类型从要实现的接口继承。
相比之下, Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)“增加”新方法。而在实现某个接口时,无需从该接口继承(事实上,Go语言根本就不支持面向对象思想中的继承语法),只需要实现该接口 要求的所有方法即可。任何类型都可以被Any类型引用。Any类型就是空接口,即interface{}。
2. 为类型添加方法
在Go语言中,你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法,例如:
type Integer int
func (a Integer) Less(b Integer) bool {
return a < b
}
在这个例子