了解基础数据类型
各位码农朋友们,在了解完 Go语言是如何声明变量和常量之后,我们要进行学习的就是变量和常量的类型了。只有真正地了解了这些数据类型的特性以及实现原理,我们才能在后面的编程生活中过的得心应手。
了解基础数据类型
Go 是一种强类型语言。 这意味着你声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值。
Go 有四类数据类型:
- 基本类型:数字、字符串和布尔值
- 聚合类型:数组和结构
- 引用类型:指针、切片、映射、函数和通道
- 接口类型:接口
在此模块中,我们仅介绍基本类型(数字类型、布尔类型)的特性、原理以及注意事项。 如果你不知道其他类型是什么,请不要担心。 我们将在后续模块中进行介绍。
整数类型
类型 | 有无符号 | 占用存储空间 | 表示范围 | 备注 |
---|---|---|---|---|
int8 | 有 | 1字节 | -2^7 ~ 2^7-1 | |
int16 | 有 | 2字节 | -2^15 ~ 2^15-1 | |
int32 | 有 | 4字节 | -2^31 ~ 2^31-1 | |
int64 | 有 | 8,字节 | -2^63 ~ 2^63-1 | |
uint8 | 无 | 1字节 | 0~2^8-1 | |
uint16 | 无 | 2字节 | 0~2^16-1 | |
uint32 | 无 | 4字节 | 0~2^32-1 | |
uint64 | 无 | 8字节 | 0~2^64-1 | |
int | 有 | 32位系统4字节 | -2^31 ~ 2^31-1 | |
64位系统8字节 | -2^63 ~ 2^63-1 | |||
uint | 无 | 32位系统4字节 | 0 ~ 2^32-1 | |
64位系统8字节 | 0~2^64-1 | |||
rune | 有 | 与int32一样 | -2^31 ~ 2^31-1 | 等价int32,表示一个unicode码 |
byte | 无 | 与uint8一样 | 0~2^8-1 | 当要存储字符时使用byte |
特性
- 当没有明显指明整数的类型时,Go编译器会自动推断,默认为
int
。 - 使用
int
时,32 位系统上的大小为 32 位,64 位系统上则为 64 位(大多数情况下如此,不过在不同计算机上或有所不同)。 - 如果需要将值表示为无符号数字,则可以使用
uint
,但仅当有特定原因时才使用此类型。 此外,Go 还提供uint8
、uint16
、uint32
和uint64
类型。 rune
只是int32
数据类型的别名。 它用于表示 Unicode 字符(或 Unicode 码位)。byte
是uint
数据类型的别名。可以理解为 C语言中的char
,表示 ASCII 字符。
实现原理
这些整数类型在内存中的存储方式其实就是二进制的位表示。比如int8
用 8 个位来存储数字,int16
用 16 个位,以此类推。这样就可以通过不同的位数来表示不同范围的数字啦。
注意事项
- 大多数情况下,你将使用
int
,但需要了解其他整数类型,因为在 Go 中,int
与int32
不同,即使整数的自然大小为 32 位也是如此。 换句话说,需要强制转换时,你需要进行显式转换。 如果尝试在不同类型之间执行数学运算,将会出现错误。 - 在进行整数运算的时候,要注意溢出问题。如果两个很大的
int32
数字相加,结果可能会超出int32
的范围,这时候就会出现奇怪的结果,就像数学考试算错了答案一样尴尬。
浮点数类型
类型 | 占用存储空间 | 表示范围 |
---|---|---|
单精度float32 | 4字节 | -3.403E38~3.403E38 |
双精度float64 | 8字节 | -1.798E308~1.798E308 |
特性
float32
和float64
分别表示 32 位和 64 位的浮点数。float64
的精度更高,可以表示更大范围的小数。- 浮点数在计算机中的存储方式可不是精确的哦,就像你用尺子量东西,总是会有一点误差。
- 可以使用
math
包中提供的math.MaxFloat32
和math.MaxFloat64
常量来查找这两种类型的限制。 - 整数部分为 0 时,可以省略不写;小数部分为 0 时,可以省略不写;但是要加上小数点
.
。
实现原理
浮点数在内存中的存储方式是采用科学计数法的形式。比如一个浮点数可以表示为m × 2^e
,其中m
是尾数,e
是指数。这样就可以用有限的位数来表示很大范围的小数啦。
注意事项
- 浮点数的比较可不能直接用
==
哦,因为浮点数有误差。比如你想判断两个浮点数是否相等,可能会得到错误的结果。正确的做法是比较它们的差值是否在一个很小的范围内。 - 在进行浮点数运算的时候,也要注意精度问题。比如多次进行浮点数运算,误差可能会累积,最后得到的结果可能和你预期的不一样。就像你走迷宫,每一步都有点偏差,最后可能就走不到终点啦。
布尔类型
布尔类型只有两个值:true
和false
。它就像一个黑白分明的小法官,判断事情只有对和错。
特性
- 布尔类型非常简单明了,要么是真,要么是假。
- 可以用于条件判断、循环控制等地方。
实现原理
布尔类型在内存中可能只占用一个位,0 表示false
,1 表示true
。不过具体的实现方式取决于编译器和操作系统。
注意事项
- 在 Go 中,不能将布尔类型隐式转换为 0 或 1,必须显式执行此操作。
- 布尔类型的赋值要小心哦,别把其他类型的值误赋值给布尔类型。比如把一个整数赋值给布尔类型,那肯定会出问题,就像你把苹果当成橘子吃,味道肯定不对呀!
- 在进行布尔运算的时候,要注意逻辑的正确性。比如
&&
(与)和||
(或)的运算顺序,别搞混了,不然程序可能会做出错误的判断。
类型转换
在 Go 语言中,不同类型之间进行操作需要进行显式的强制转换。
- 数字之间可以直接通过
类型(变量名/变量值)
实现强制转换; - 字符串和数字之间的转换需要借助
strconv
包来实现;
不同类型之间的转换可能会出现精度的丢失,需要谨慎使用。
总结
在 Go语言中,基础的变量类型在使用时需要注意的点并不是很多,这也是其简单特性的体现之一。只有在使用浮点数类型时,需要注意其精度问题,有可能会出现一些奇怪的错误。由于字符串类型(string) 在Go语言中是一个比较特殊的存在,所以后面会单独去分析,这里就不提了,只需要知道字符串是不可更改的即可。
参考
写完博客不耽误做一个笔试,狗头保命。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随便寻个地方'Blog!