Go类型系统(一)
类型系统
一:概述
类型系统是指一个语言类型语言体系结构,一个典型的类型系统包含如下基本类型
基础类型,如byte、int、bool、float等;
复合类型,如数组、结构体、指针等;
可以指向任意对象的类型(Any类型);
值语义和引用语义;
面向对象,即所有具备面向对象特征(比如成员方法)的类型;
接口。
C#在其他面向对象语言中一般类型系统主要分两大类 值类型和引用类型,而在他们两种类型的转换过程中,int(值类型)类型要转换成string(引用类型),需要做装箱的操作
这样的话会消耗多余的系统性能。
GO相比之下,Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)“增加”新方法。
二:为类型添加方法
在Go语言中可以为任何类型添加方法,如下例子
type Integer int //1:定义一个int类型的类型 ,我理解为对int类型定义了别名 像C中的typeof
func (this Integer) Add(b Integer) int{ //2:为该类型定义一个方法 注意这点要是为某一个类型定义方法的时候
return this+b //必须要在方法名称的前面添加(this 类型名称)将该类型传递过去
}
var a Integer=2 //3:声明一个该类型的变量
c:= (int)a.Add(3) //4:调用该方法,接着最后转换为系统的int类型 是不是和面向对象的定义基本上一样
在看一下C#语言中为类型定义方法
class Integer{ //1:定义一个int类型的类型
int val=0;
public Integer(Integer a){ //定义一个构造函数 初始化变量a
this.val=a.val; //有很多在在学习面向对象的时候不知道this到底是干什么的其实就是Go语言中的this 指的是该对象本身
}
public int Add(Integer b){ //定义一个Add的方法
return this.val+b.val;
}
}
Integer integer=new Integer(3); //初始化该类型
int c=integer.Add(3); //调用该方法 接着获取结果 基本上和Go语言中的一样
上面介绍了Go语言中的面向对象的基本概念 ,从上面我们可以看出来C#和java等面向对象其实就是将(this 类型名称)隐藏了起来
上面的例子只是简单的加总,我们如何要直接改变该对象的本事的话,需要向方法里面传递的就是*Integer了,如下:
func (this *Integer) Div(a Integer){
*this=*this-a
}
var a Integer=2
a.Div(1)
fmt.Print(a) //这边的a值就直接变化为1了,传递了*对象 当在方法中操作他后,代表这改变了这个对象本身
是因为Go语言和C语言一样,类型都是基于值传递的。要想修改变量的值,只能传递指针。
三:值语义和引用语义
如果b的修改不会影响a的值,那么此类型属于值类型。如果会影响a的值,那么此类型是引用类型。
GO语言中一般都是值类型
基本类型,如byte、int、bool、float32、float64和string等;
复合类型,如数组(array)、结构体(struct)和指针(pointer)等。
但是有四种引用类型,给他们定义为引用类型的原因是这些类型进行传值Copy基本上没有必要
数组切片:指向数组(array)的一个区间。
数组切片本质上是一个区间,你可以大致将[]T表示为:
type slice struct {
first *T
len int
cap int
}
map:极其常见的数据结构,提供键值查询能力。
channel:执行体(goroutine)间的通信设施。
接口(interface):对一组满足某个契约的类型的抽象。
type interface struct {
data *void
itab *Itab
}
三:结构体
struct 在Go语言中等同与其他面向对象语言中的class,但是Go放弃了面向对象中的大部分继承相关的特性,只保留了面向对象中的最基本的特性组合(composition)
组合只是形成复合类型的基础。
定义一个矩形类:eg
type Rect struct{
x,y float32
width,height float64
}
给这个类型写一个方法
func (this *Rect) Area() float64{
return this.width*this.height
}
从上面我们可以看出来这个写法和写c语言只有在写方法的时候多传递了对象自己