这篇文章已经放到腾讯智能工作台的知识库啦,链接在这里:ima.copilot-Go 入门到入土。要是你有啥不懂的地方,就去知识库找 AI 聊一聊吧。
Go 语言提供了一套丰富的基础数据类型,主要可以分为三大类:布尔类型、数值类型和字符串类型。理解这些类型的特性和选择恰当的类型,对于编写高效、健壮的 Go 代码至关重要。
布尔类型用于表示逻辑值,它只有两个可能的值:true 或 false。这在所有编程语言中都非常基础和通用。
booltrue、false (均为小写)Go 语言的数值类型非常丰富,提供了多种大小和精度的选择,让开发者能在性能和内存占用之间做出精细的权衡。
int):可以表示正数、负数和零。int8: 占用 1 字节,范围 -128 到 127int16: 占用 2 字节,范围 -32768 到 32767int32: 占用 4 字节int64: 占用 8 字节uint):只能表示非负数(大于等于零)。uint8: 占用 1 字节,范围 0 到 255uint16: 占用 2 字节,范围 0 到 65535uint32: 占用 4 字节uint64: 占用 8 字节选择合适的整数类型: 以表示“年龄”为例,年龄不可能是负数,且一般不会超过 255 岁。因此,使用 uint8 是最节省空间且最合适的选择。若使用 int8,则浪费了一半的表示范围来存储无意义的负数。
特殊的 int 和 uint: 除了固定大小的整数类型,Go 还提供了 int 和 uint 类型,它们的大小取决于目标平台的操作系统(32位或64位)。为方便起见,通常会使用 int,但当对内存或数值范围有精确要求时,应使用固定大小的类型。
严格的类型转换: Go 是一种强类型语言,不同类型的整数之间不能直接赋值,必须进行显式转换。

注意:从大范围类型向小范围类型转换时,可能会发生数据丢失(精度溢出)。
浮点数用于表示小数。
float32: 32位浮点数,精度较低。float64: 64位浮点数,精度更高,是默认的小数类型。
它们的表示范围远大于整数类型,例如 float64 可以表示高达 1.8 x 10^308 的数值。
byte 和 rune)Go 语言没有专门的 char 类型,而是用 byte 和 rune 来处理字符。
byte:uint8 的别名,占用 1 个字节。

rune:
- 它是 int32 的别名,占用 4 个字节。
- 用于表示任意 Unicode 字符,包括中文、日文、韩文等。当你不确定要处理的字符范围时,rune 是更安全的选择。

字符串是字符的只读序列,在 Go 中使用 string 关键字定义。
"" 包裹。
在 Go 语言中,数据类型转换是一项非常常见且重要的操作。由于 Go 提供了丰富的数值类型,并且拥有严格的类型系统,因此在不同类型之间传递数据时,必须进行显式转换。
在处理各种 int、float 等数值类型时,转换过程非常直观。
不同数值类型之间的转换,无论是整型之间(如 int8 转 int32),还是整型与浮点型之间,都使用 T(v) 的语法格式,其中 T 代表目标类型,v 是要转换的变量。

注意:将浮点型转换为整型时,小数部分会被直接舍弃(截断),而不是四舍五入。
Go 允许使用 type 关键字为现有类型定义一个别名,这有助于提高代码的可读性。例如,byte 是 uint8 的别名,rune 是 int32 的别名。
当定义一个别名时,Go 会将其视为一个全新的、独立的数据类型。因此,即便是底层类型相同的变量,也必须进行显式转换。

Go 的这种严格类型检查机制,虽然要求开发者多写一些转换代码,但极大地增强了程序的健壮性和类型安全,避免了许多潜在的错误。
字符串与数字之间的转换是另一类常见的需求,这通常需要借助标准库 strconv 来完成。
strconv.Atoi (ASCII to Integer) 函数用于将一个十进制字符串转换为 int 类型。由于字符串可能包含非数字字符,导致转换失败,因此该函数会返回两个值:转换后的结果和一个 error 对象。
在使用时,必须检查返回的 error 是否为 nil,以确保转换成功。


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

掌握这些基本的类型转换方法是编写 Go 程序的基础。对于更复杂的转换场景,Go 标准库也提供了丰富的工具支持。
对于更复杂的场景,如不同进制、浮点数或需要格式化控制时,strconv 提供了功能更强大的 Parse 和 Format 系列函数。
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: 将字符串解析为布尔值。true。false。
Format系列:其他类型 -> 字符串Format 系列函数是 Parse 的逆操作,它将不同的数据类型转换为字符串,并允许进行精细的格式化控制。
FormatFloat: 将浮点数转换为字符串。fmt 参数是格式化字符(如 'f' 表示标准小数,'e' 表示科学计数法)。prec 控制精度(小数位数)。FormatInt: 将整数转换为指定进制的字符串。base 参数指定目标进制(2 到 36)。FormatBool: 将布尔值转换为字符串 "true" 或 "false"。
strconv.Atoi() 和 strconv.Itoa() 是最简洁、最常用的选择。Parse 和 Format 系列函数。这些函数提供了必要的参数来精确控制转换过程和输出格式。掌握这些类型转换方法是编写健壮、高效 Go 程序的基础。
运算符是用于执行数据运算、赋值和比较的特殊符号。Go 语言的运算符与其他主流编程语言(如 C++ 或 Java)非常相似,理解它们是编写任何程序的基础。
算术运算符用于执行基本的数学运算。
运算符 | 描述 | 示例 |
|---|---|---|
| 相加 |
|
| 相减 |
|
| 相乘 |
|
| 相除 |
|
| 取余(取模) |
|
| 自增 |
|
| 自减 |
|
注意:
+ 运算符也可用于拼接字符串。++ 和 -- 在 Go 中是语句,而不是表达式。因此,你不能写 c := a++ 这样的代码。
关系运算符用于比较两个值,其结果总是一个布尔值(true 或 false)。
运算符 | 描述 |
|---|---|
| 等于 |
| 不等于 |
| 大于 |
| 小于 |
| 大于等于 |
| 小于等于 |
逻辑运算符常用于组合多个关系表达式,其结果也是一个布尔值。
运算符 | 描述 |
|---|---|
| 逻辑与 (AND),两者都为 |
|| | 左右条件任意一个为 |
| 逻辑非 (NOT),反转布尔值 |

位运算符对整数在内存中的二进制位进行操作,常用于底层代码优化和数据处理,因为它们的执行效率非常高。
运算符 | 描述 |
|---|---|
| 按位与 (AND) |
| | 按位或(|) |
| 按位异或 (XOR) |
| 左移 |
| 右移 |
按位与 (&) 示例: 它会对两个数字的二进制表示的每一位进行比较,只有当两个相应的位都为 1 时,结果的该位才为 1。
例如,60 & 13 的计算过程如下:
60 的二进制是 0011 110013 的二进制是 0000 11010000 1100,即十进制的 12。
赋值运算符用于给变量分配一个值。
运算符 | 等效于 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
| a = a & b ,a = a | b |
| 按位左/右移赋值 |

Go 还有一些特殊的运算符,它们的功能会根据上下文发生变化。
运算符 | 描述 |
|---|---|
| 取地址运算符:当放在变量前时,返回该变量的内存地址。 |
| 指针运算符:当用在指针类型前时,获取该指针指向的变量的值。 |

这两个运算符与指针密切相关,我们将在后续的指针章节中详细讲解。
当一个表达式中包含多个运算符时,会根据优先级来决定计算顺序。下表从高到低排列了运算符的优先级。
优先级 | 运算符 |
|---|---|
最高 |
|
| |
| |
| |
| |
最低 | , |
在编写复杂表达式时,建议使用括号 () 来明确指定运算顺序,这能极大地提高代码的可读性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。