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语言只有在写方法的时候多传递了对象自己