在GoLang中,有符号的整数类型有如下几种
-128~127-2^15~2^15-1-2^31~2^31-1-2^63~2^63-1
-2^31~2^31-1-2^63~2^63-1
无符号的整数——uint
与上文的有符号的整数int相比,无符号uint的特点则是这类数据类型的最小值一定等于0,不会出现像int一样表数范围最小值涉及负数的情况。
通俗来说,uint是存放非零整数的数据类型
与上文的int一样,uint也有好几种类型,如下:
0~2550~2^16-10~2^32-10~2^64-10~2^32-1
与int和uint有关联的其他数据类型
GoLang中其他数据类型与int或uint有相似的地方,但他们的的用途却不一样
byte与uint的关系
0~2550~255
rune与int的关系
rune与int32等价,他们的表数范围和所占空间都是一样的,但是rune所代表的是一个Unicode码,它似乎也可以存放字符,它的使用准则也与byte类似,rune不该被用来存储与int一样的数据
验证
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代码的规范,这或许也能帮助我们写出其他语言的规范代码
谢谢你阅读本篇文章,喜欢的话可以点个赞,如果发现文章存在部分错误的表述,欢迎指出,你的纠正是我提升的机会。