• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go类型系统(一)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go--避免SQL注入发布时间:2022-07-10
下一篇:
Go语言操作MySQL发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap