各位码农朋友们,在了解完 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 还提供 uint8uint16uint32uint64 类型。
  • rune 只是 int32 数据类型的别名。 它用于表示 Unicode 字符(或 Unicode 码位)。
  • byteuint 数据类型的别名。可以理解为 C语言中的 char,表示 ASCII 字符。

实现原理

这些整数类型在内存中的存储方式其实就是二进制的位表示。比如int8用 8 个位来存储数字,int16用 16 个位,以此类推。这样就可以通过不同的位数来表示不同范围的数字啦。

注意事项

  • 大多数情况下,你将使用 int,但需要了解其他整数类型,因为在 Go 中,intint32 不同,即使整数的自然大小为 32 位也是如此。 换句话说,需要强制转换时,你需要进行显式转换。 如果尝试在不同类型之间执行数学运算,将会出现错误。
  • 在进行整数运算的时候,要注意溢出问题。如果两个很大的int32数字相加,结果可能会超出int32的范围,这时候就会出现奇怪的结果,就像数学考试算错了答案一样尴尬。

浮点数类型

类型 占用存储空间 表示范围
单精度float32 4字节 -3.403E38~3.403E38
双精度float64 8字节 -1.798E308~1.798E308

特性

  • float32float64分别表示 32 位和 64 位的浮点数。float64的精度更高,可以表示更大范围的小数。
  • 浮点数在计算机中的存储方式可不是精确的哦,就像你用尺子量东西,总是会有一点误差。
  • 可以使用 math 包中提供的 math.MaxFloat32math.MaxFloat64 常量来查找这两种类型的限制。
  • 整数部分为 0 时,可以省略不写;小数部分为 0 时,可以省略不写;但是要加上小数点 .

实现原理

浮点数在内存中的存储方式是采用科学计数法的形式。比如一个浮点数可以表示为m × 2^e,其中m是尾数,e是指数。这样就可以用有限的位数来表示很大范围的小数啦。

注意事项

  • 浮点数的比较可不能直接用==哦,因为浮点数有误差。比如你想判断两个浮点数是否相等,可能会得到错误的结果。正确的做法是比较它们的差值是否在一个很小的范围内。
  • 在进行浮点数运算的时候,也要注意精度问题。比如多次进行浮点数运算,误差可能会累积,最后得到的结果可能和你预期的不一样。就像你走迷宫,每一步都有点偏差,最后可能就走不到终点啦。

布尔类型

布尔类型只有两个值:truefalse。它就像一个黑白分明的小法官,判断事情只有对和错。

特性

  • 布尔类型非常简单明了,要么是真,要么是假。
  • 可以用于条件判断、循环控制等地方。

实现原理

布尔类型在内存中可能只占用一个位,0 表示false,1 表示true。不过具体的实现方式取决于编译器和操作系统。

注意事项

  • 在 Go 中,不能将布尔类型隐式转换为 0 或 1,必须显式执行此操作。
  • 布尔类型的赋值要小心哦,别把其他类型的值误赋值给布尔类型。比如把一个整数赋值给布尔类型,那肯定会出问题,就像你把苹果当成橘子吃,味道肯定不对呀!
  • 在进行布尔运算的时候,要注意逻辑的正确性。比如&&(与)和||(或)的运算顺序,别搞混了,不然程序可能会做出错误的判断。

类型转换

在 Go 语言中,不同类型之间进行操作需要进行显式的强制转换。

  • 数字之间可以直接通过 类型(变量名/变量值)实现强制转换;
  • 字符串和数字之间的转换需要借助 strconv 包来实现;

不同类型之间的转换可能会出现精度的丢失,需要谨慎使用。

总结

在 Go语言中,基础的变量类型在使用时需要注意的点并不是很多,这也是其简单特性的体现之一。只有在使用浮点数类型时,需要注意其精度问题,有可能会出现一些奇怪的错误。由于字符串类型(string) 在Go语言中是一个比较特殊的存在,所以后面会单独去分析,这里就不提了,只需要知道字符串是不可更改的即可。

参考

写完博客不耽误做一个笔试,狗头保命。