类型系统 一:概述 类型系统是指一个语言类型语言体系结构,一个典型的类型系统包含如下基本类型 基础类型,如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语言只有在写方法的时候多传递了对象自己
|
请发表评论