golang快速入门:基本数据类型

110 阅读6分钟

WechatIMG374.jpg

那就好好生活努力成长吧,生活慢慢亦漫漫,一切难讲。

Go 基本数据类型

  • 布尔类型

  • 整型

  • 浮点类型

  • 复数类型

  • 字符类型

  • 字符串

布尔类型

Go 语言中的布尔类型与其他主流编程语言差不多,类型关键字为 bool,可赋值且只可以赋值为预定义常量 true 和 false

carbon (13).png

Go 是强类型语言,变量类型一旦确定,就不能将其他类型的值赋值给该变量,因此,布尔类型不能接受其他类型的赋值,也不支持自动或强制的类型转换。

carbon (14).png

布尔类型无法参与数值运算,也无法与其他类型进行转换 布尔类型的默认值为false

在 Go 语言中,不同类型的值不能使用 == 或 != 运算符进行比较,在编译期就会报错。

整型

整型是所有编程语言里最基础的数据类型,Go 语言默认支持如下这些整型类型:

场景-学习提纲.png

  • 默认的数字定义类型是int类型

  • 带个u就是无符号型,只能存正整数

  • 后面的数字就是2进制的位数

  • uint8还有一个别名byte,一个字节等于8个bit位

  • int类型的大小取决于所使用的平台

Go 支持的整型类型非常丰富,你可以根据需要设置合适的整型类型,以节省内存空间,int 和 int32 在 Go 语言里被认为是两种不同的类型(同理,int 和 int64 也是不同的类型),编译器也不会帮你自动做类型转换,比如以下的例子会有编译错误:

carbon (15).png

用强制类型转换可以解决这个编译错误:

carbon (16).png

浮点型

浮点型也叫浮点数,用于表示包含小数点的数据,比如 3.141.00 都是浮点型数据。

Go 语言支持两种浮点类型 float32 和 float64,其中 float32 是单精度浮点数,可以精确到小数点后 7 位,float64 是双精度浮点数,可以精确到小数点后 15 位。

float32浮点数的最大范围为3.4e38

float64浮点数的最大范围为1.8e308

在 Go 语言里,定义一个浮点型变量的代码如下

carbon (17).png

如果没有显示声明类型,则默认为float64,在实际开发中,应该尽可能地使用 float64 类型,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。

浮点数不是一种精确的表达方式,因为二进制无法精确表示所有十进制小数

carbon (18).png

你觉得上面计算结果 floatValue6 的值是多少?0.8?不,它的结果是 0.7999999999999999,这是因为计算机底层将十进制的 0.1 和 0.7 转化为二进制表示时,会丢失精度,所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

浮点数的运算和整型一样,也要保证操作数的类型一致,float32 和 float64 类型数据不能混合运算,需要手动进行强制转化才可以,这一点和动态语言不同。

浮点数支持通过算术运算符进行四则运算,也支持通过比较运算符进行比较(前提是运算符两边的操作数类型一致)

复数类型

除了整型和浮点型之外,Go 语言还支持复数类型,与复数相对,我们可以把整型和浮点型这种日常比较常见的数字称为实数,复数是实数的延伸,可以通过两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag),常见的表达形式如下:

carbon (19).png

其中 a、b 均为实数,i 称为虚数单位,当 b = 0 时,z 就是常见的实数,当 a = 0 而 b ≠ 0 时,将 z 称之为纯虚数,如果你理解数学概念中的复数概念,这些都很好理解。

在 Go 语言中,复数支持两种类型:complex64(32 位实部和虚部) 和 complex128(64 位实部与虚部),对应的表示示例如下,和数学概念中的复数表示形式一致:

carbon (20).png

对于一个复数 z = complex(x, y),就可以通过 Go 语言内置函数 real(z) 获得该复数的实部,也就是 x,通过 imag(z) 获得该复数的虚部,也就是 y

复数支持和其它数字类型一样的算术运算符。当你使用 == 或者 != 对复数进行比较运算时,由于构成复数的实数部分也是浮点型,需要注意对精度的把握。

字符类型

Go 语言对字符串中的单个字符进行了单独的类型支持,在 Go 语言中支持两种字符类型:

  • byte,代表 UTF-8 编码中单个字节的值(它也是 uint8 类型的别名,两者是等价的,因为正好占据 1 个字节的内存空间);

  • rune,代表单个 Unicode 字符(它也是 int32 类型的别名,因为正好占据 4 个字节的内存空间。)。

carbon (21).png

UTF-8 和 Unicode 的区别

从 Unicode 字符集的视角看,字符串的每个字符都是一个字符的独立单元,但如果从 UTF-8 编码的视角看,一个字符可能是由多个字节编码而来的。

字符串

在 Go 语言中,字符串是一种基本类型,默认是通过 UTF-8 编码的字符序列,当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节,比如中文编码通常需要 3 个字节。

  1. 声明和初始化

Go 语言的字符串不支持单引号,只能通过双引号定义字符串字面值,默认值是空字符串

carbon (22).png

  1. 转义字符

如果要对特定字符进行转义,可以通过 \ 实现,就像我们上面在字符串中转义双引号和换行符那样,常见的需要转义的字符如下所示:

  • \n :换行符
  • \r  :回车键
  • \t  :制表符
  • \u  :Unicode 字符
  • \   :反斜杠自身
  1. 多行字符串

多行字符串,可以通过 ` 构建

carbon (23).png

  1. 字符串连接 字符串连接只需要通过 + 连接符即可:

carbon (25).png

零值问题

如果我们操作数据类型,只声明不赋值,变量默认对应类型的零值。例如 int 为0 、bool 为false、字符串为""。

carbon (26).png