Go 语言的基础数据类型

这篇文章已经放到腾讯智能工作台的知识库啦,链接在这里:ima.copilot-Go 入门到入土。要是你有啥不懂的地方,就去知识库找 AI 聊一聊吧。

Go 语言提供了一套丰富的基础数据类型,主要可以分为三大类:布尔类型数值类型字符串类型。理解这些类型的特性和选择恰当的类型,对于编写高效、健壮的 Go 代码至关重要。

1、数值、浮点型、和字符类型

1、布尔类型 (Boolean)

布尔类型用于表示逻辑值,它只有两个可能的值:truefalse。这在所有编程语言中都非常基础和通用。

  • 关键字bool
  • truefalse (均为小写)

2、数值类型 (Numeric)

Go 语言的数值类型非常丰富,提供了多种大小和精度的选择,让开发者能在性能和内存占用之间做出精细的权衡。

2.1 整数类型 (Integer)

  • 有符号整数 (int):可以表示正数、负数和零。

    • int8: 占用 1 字节,范围 -128 到 127
    • int16: 占用 2 字节,范围 -32768 到 32767
    • int32: 占用 4 字节
    • int64: 占用 8 字节
  • 无符号整数 (uint):只能表示非负数(大于等于零)。

    • uint8: 占用 1 字节,范围 0 到 255
    • uint16: 占用 2 字节,范围 0 到 65535
    • uint32: 占用 4 字节
    • uint64: 占用 8 字节

选择合适的整数类型 : 以表示"年龄"为例,年龄不可能是负数,且一般不会超过 255 岁。因此,使用 uint8 是最节省空间且最合适的选择。若使用 int8,则浪费了一半的表示范围来存储无意义的负数。

特殊的 intuint : 除了固定大小的整数类型,Go 还提供了 intuint 类型,它们的大小取决于目标平台的操作系统(32位或64位)。为方便起见,通常会使用 int,但当对内存或数值范围有精确要求时,应使用固定大小的类型。

严格的类型转换: Go 是一种强类型语言,不同类型的整数之间不能直接赋值,必须进行显式转换。

注意:从大范围类型向小范围类型转换时,可能会发生数据丢失(精度溢出)。

2.2 浮点数类型 (Floating-Point)

浮点数用于表示小数。

  • float32: 32位浮点数,精度较低。
  • float64: 64位浮点数,精度更高,是默认的小数类型。

它们的表示范围远大于整数类型,例如 float64 可以表示高达 1.8 x 10^308 的数值。

2.3 字符类型 (byterune)

Go 语言没有专门的 char 类型,而是用 byterune 来处理字符。

  • byte :
    • 它是 uint8别名,占用 1 个字节。
    • 主要用于表示 ASCII 字符(如英文字母、数字)。
    • 其本质是一个整数,可以直接进行数学运算。
  • rune :
    • 它是 int32别名,占用 4 个字节。
    • 用于表示任意 Unicode 字符 ,包括中文、日文、韩文等。当你不确定要处理的字符范围时,rune 是更安全的选择。

3、字符串类型 (String)

字符串是字符的只读序列,在 Go 中使用 string 关键字定义。

  • 定义 :使用双引号 "" 包裹。
  • 特性:字符串是不可变的,一旦创建,其内容不能被修改。

2、基本类型的装换

在 Go 语言中,数据类型转换是一项非常常见且重要的操作。由于 Go 提供了丰富的数值类型,并且拥有严格的类型系统,因此在不同类型之间传递数据时,必须进行显式转换。

1、数值类型之间的转换

在处理各种 intfloat 等数值类型时,转换过程非常直观。

1.1 整型与浮点型互转

不同数值类型之间的转换,无论是整型之间(如 int8int32),还是整型与浮点型之间,都使用 T(v) 的语法格式,其中 T 代表目标类型,v 是要转换的变量。

注意:将浮点型转换为整型时,小数部分会被直接舍弃(截断),而不是四舍五入。

1.2 类型别名与严格性

Go 允许使用 type 关键字为现有类型定义一个别名,这有助于提高代码的可读性。例如,byteuint8 的别名,runeint32 的别名。

当定义一个别名时,Go 会将其视为一个全新的、独立的数据类型。因此,即便是底层类型相同的变量,也必须进行显式转换。

Go 的这种严格类型检查机制,虽然要求开发者多写一些转换代码,但极大地增强了程序的健壮性和类型安全,避免了许多潜在的错误。

2、字符串与数字之间的转换

字符串与数字之间的转换是另一类常见的需求,这通常需要借助标准库 strconv 来完成。

2.1 字符串转数字

strconv.Atoi (ASCII to Integer) 函数用于将一个十进制字符串转换为 int 类型。由于字符串可能包含非数字字符,导致转换失败,因此该函数会返回两个值:转换后的结果和一个 error 对象。

在使用时,必须检查返回的 error 是否为 nil,以确保转换成功。

2.2 数字转字符串

strconv.Itoa (Integer to ASCII) 函数则用于将 int 类型转换为字符串。与 Atoi 不同,从整型到字符串的转换总是可以成功的,因此 Itoa 函数只返回一个转换后的字符串结果,不返回 error

掌握这些基本的类型转换方法是编写 Go 程序的基础。对于更复杂的转换场景,Go 标准库也提供了丰富的工具支持。

3、fromat 进行格式化转换

对于更复杂的场景,如不同进制、浮点数或需要格式化控制时,strconv 提供了功能更强大的 ParseFormat 系列函数。

1、Parse系列:字符串 -> 其他类型

Parse 系列函数用于将字符串解析为不同的数据类型,提供了比 Atoi 更丰富的控制选项。

  • ParseFloat : 将字符串解析为浮点数。
    • bitSize 参数指定了目标浮点数的位数(32 或 64)。
  • ParseInt : 将字符串解析为整数,可以指定进制。
    • base 参数指定了字符串的进制(2 到 36)。如果 base 为 0,则会根据字符串前缀(如 0x 为十六进制,0 为八进制)自动推断。
    • bitSize 指定了结果的整数类型(0, 8, 16, 32, 64 分别对应 int, int8, int16, int32, int64)。
  • ParseBool : 将字符串解析为布尔值。
    • 它能识别 "1", "t", "T", "true", "TRUE", "True" 为 true
    • 它能识别 "0", "f", "F", "false", "FALSE", "False" 为 false

2、Format系列:其他类型 -> 字符串

Format 系列函数是 Parse 的逆操作,它将不同的数据类型转换为字符串,并允许进行精细的格式化控制。

  • FormatFloat : 将浮点数转换为字符串。
    • fmt 参数是格式化字符(如 'f' 表示标准小数,'e' 表示科学计数法)。
    • prec 控制精度(小数位数)。
  • FormatInt : 将整数转换为指定进制的字符串。
    • base 参数指定目标进制(2 到 36)。
  • FormatBool: 将布尔值转换为字符串 "true" 或 "false"。

总结与选择

  • 简单场景 : 当你只需要在十进制整数字符串 之间进行转换时,strconv.Atoi()strconv.Itoa() 是最简洁、最常用的选择。
  • 复杂场景 : 当你需要处理浮点数布尔值 ,或者需要在不同进制 之间转换时,应使用功能更强大的 ParseFormat 系列函数。这些函数提供了必要的参数来精确控制转换过程和输出格式。

掌握这些类型转换方法是编写健壮、高效 Go 程序的基础。

4、运算符和表达式

Go 语言运算符和表达式

运算符是用于执行数据运算、赋值和比较的特殊符号。Go 语言的运算符与其他主流编程语言(如 C++ 或 Java)非常相似,理解它们是编写任何程序的基础。

1、算术运算符

算术运算符用于执行基本的数学运算。

运算符 描述 示例
+ 相加 a + b
- 相减 a - b
* 相乘 a * b
/ 相除 a / b
% 取余(取模) a % b
++ 自增 a++
-- 自减 a--

注意

  • + 运算符也可用于拼接字符串。
  • ++-- 在 Go 中是语句,而不是表达式。因此,你不能写 c := a++ 这样的代码。

2、关系运算符

关系运算符用于比较两个值,其结果总是一个布尔值(truefalse)。

运算符 描述
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

3、逻辑运算符

逻辑运算符常用于组合多个关系表达式,其结果也是一个布尔值。

运算符 描述
&& 逻辑与 (AND),两者都为 true 时,结果为 true
|| 左右条件任意一个为true ,结果即为true
! 逻辑非 (NOT),反转布尔值

4、位运算符

位运算符对整数在内存中的二进制位进行操作,常用于底层代码优化和数据处理,因为它们的执行效率非常高。

运算符 描述
& 按位与 (AND)
| 按位或(|)
^ 按位异或 (XOR)
<< 左移
>> 右移

按位与 (&) 示例: 它会对两个数字的二进制表示的每一位进行比较,只有当两个相应的位都为 1 时,结果的该位才为 1。

例如,60 & 13 的计算过程如下:

  • 60 的二进制是 0011 1100
  • 13 的二进制是 0000 1101
  • 按位与的结果是 0000 1100,即十进制的 12

5、赋值运算符

赋值运算符用于给变量分配一个值。

运算符 等效于
= a = b
+= a = a + b
-= a = a - b
*= a = a * b
/= a = a / b
%= a = a % b
&=, |= a = a & b ,a = a | b
<<=, >>= 按位左/右移赋值

6、其他运算符

Go 还有一些特殊的运算符,它们的功能会根据上下文发生变化。

运算符 描述
& 取地址运算符:当放在变量前时,返回该变量的内存地址。
* 指针运算符:当用在指针类型前时,获取该指针指向的变量的值。

这两个运算符与指针密切相关,我们将在后续的指针章节中详细讲解。

7、运算符优先级

当一个表达式中包含多个运算符时,会根据优先级来决定计算顺序。下表从高到低排列了运算符的优先级。

优先级 运算符
最高 ^ !
* / % << >> &
+ - `
== != < <= > >=
&&
最低 ,

在编写复杂表达式时,建议使用括号 () 来明确指定运算顺序,这能极大地提高代码的可读性。

相关推荐
惜鸟8 分钟前
Spring Boot项目自己封装一个分页查询工具
spring boot·后端
Dithyrambus8 分钟前
ObjectScript 中文入门教程
后端
林太白33 分钟前
也许看了Electron你会理解Tauri,扩宽你的技术栈
前端·后端·electron
松果集39 分钟前
【Python3】练习一
后端
anganing40 分钟前
Web 浏览器预览 Excel 及打印
前端·后端
肯定慧43 分钟前
B1-基于大模型的智能办公应用软件
后端
TinyKing1 小时前
一、getByRole 的作用
后端
brzhang1 小时前
我们复盘了100个失败的AI Agent项目,总结出这3个“必踩的坑”
前端·后端·架构
郝同学的测开笔记1 小时前
云原生探索系列(十九):Go 语言 context.Context
后端·云原生·go