有符号的整数——int
在GoLang中,有符号的整数类型有如下几种
- int8:所占空间为1字节,表数范围则是
-128~127
- int16:所占空间为2字节,表数范围则是
-2^15~2^15-1
- int32:所占空间为4字节,表数范围则是
-2^31~2^31-1
- int64:所占空间为8字节,表数范围则是
-2^63~2^63-1
- int:下文做讲解
其中,int的所占空间根据自身电脑而决定,如果你的电脑是32位的操作系统,那么int将等价于int32,那么他的所占空间则与int32一样都是4字节,他的表述范围就是-2^31~2^31-1
,同理,如果电脑是64位操作系统的话,那么int将等价于int64,他所占的空间就是8字节,他的表述范围就是-2^63~2^63-1
无符号的整数——uint
与上文的有符号的整数int相比,无符号uint的特点则是这类数据类型的最小值一定等于0,不会出现像int一样表数范围最小值涉及负数的情况。
通俗来说,uint是存放非零整数的数据类型
与上文的int一样,uint也有好几种类型,如下:
- uint8:所占空间为1字节,表数范围则是
0~255
- uint16:所占空间为2字节,表数范围则是
0~2^16-1
- uint32:所占空间为4字节,表数范围则是
0~2^32-1
- uint64:所占空间为8字节,表数范围则是
0~2^64-1
- uint:下文做讲解
与int一样,uint的所占空间同样也是依据操作系统来决定的,是32位就与uint32等价,所占空间为4字节,,表数范围则是0~2^32-1
,依此能够类推出是64位电脑的情况是怎么样的,这里就不做赘述。
与int和uint有关联的其他数据类型
GoLang中其他数据类型与int或uint有相似的地方,但他们的的用途却不一样
byte与uint的关系
关于byte的讲解后续再做文章阐述
byte同样也是GoLang中的一个数据类型,类似于Java语言的char,同样也是只能存放单个字符,他存放的值代表的是ASCII码。
在GoLang中byte与uint8实际上是等价的,他们都占1字节的空间,表数范围都是0~255
,但是呢我们也要明白GoLang设计者对GoLang下的定义:每个问题只有一个解决方案
虽然byte与uint8无论占用空间还是表数范围都是一样,但你不可以说我能用uint8存放数值数据,那么我也可以用byte存储数值数据,那么这与每个问题只有一个解决方案的设计理念像违背了。
实际上byte的真正用途是用来存放单个字符的,仅此而已,在真正开发或者学习的过程中需要将每个数据类型的使用场景区分开
另外,因为byte的表数空间为0~255
,倘若你要用它去存放超过这个表数范围的值,还是推荐你使用uint别的类型
rune与int的关系
rune与int32等价,他们的表数范围和所占空间都是一样的,但是rune所代表的是一个Unicode码,它似乎也可以存放字符,它的使用准则也与byte类似,rune不该被用来存储与int一样的数据
验证
说了这么多,如何检验呢?
GoLang中提供了unsafe.Sizeof()
方法,可以为我们查看当前变量的数据类型的所占空间
var a int32 = 10
var b uint8 = 20
var c rune = 30
var d byte = 40
fmt.Printf("int所占的字节数为%d\n", unsafe.Sizeof(a)) //4
fmt.Printf("uint所占的字节数为%d\n", unsafe.Sizeof(b)) //1
fmt.Printf("rune所占的字节数为%d\n", unsafe.Sizeof(c)) //4,证明了rune与int32等价
fmt.Printf("byte所占的字节数为%d\n", unsafe.Sizeof(d)) //1,证明了byte与uint8等价
重点说明
我们学习完以上的int和uint以及他们衍生的数据类型,你是否认为他们就是一个大家族的人,不同类型的数值可以相互四则运算?这是错误的
无论是int32还是int64,他们终究不是同一类型,而在GoLang中不同的数据类型是不可以进行四则运算的,例如下面的代码
var a int = 10
var b uint = 20
c := a + b;//a与b一个是int(64)一个是uint,不是同一个类型不能运算
你会想问:可以有别的方式让不同数据类型的数值进行四则运算呢?很遗憾并没有,倘如真想让不同数据类型的数值相加,只有进行强制类型转换,转成相同的数据类型,才能够相加,例如
var a int = 10
var b uint = 20
c := a + uint(b);//进行类型转换后,加号左右两边的数据类型都是int,这就可以相加了
简单总结,不同的数据类型是不能够相加的
可能我们学习惯了Python这样的动态语言,可以随意的对不同数据进行运算,但是呢这也变相的增加了我们的代码不规范性,而GoLang对我们进行了规范限制,让我们尽可能使用相同的数据类型,就算使用不同的数据类型,也要保证我们进行运算的数值类型相统一,正如同我在上篇GoLang的变量命名提到的一样,定义的局部变量是一定要使用的,不要出现定义了但不实用的局部变量,这同样也是增加我们代码规范性的方式。总而言之,GoLang看似苛刻的条件实际上也是为了保证不规范代码的出现,统一GoLang开发者的代码水平,那么就需要我们记住GoLang代码的规范,这或许也能帮助我们写出其他语言的规范代码
谢谢你阅读本篇文章,喜欢的话可以点个赞,如果发现文章存在部分错误的表述,欢迎指出,你的纠正是我提升的机会。