这篇文章已经放到腾讯智能工作台的知识库啦,链接在这里:ima.copilot-Go 入门到入土。要是你有啥不懂的地方,就去知识库找 AI 聊一聊吧。
Go 语言提供了一套丰富的基础数据类型,主要可以分为三大类:布尔类型 、数值类型 和字符串类型。理解这些类型的特性和选择恰当的类型,对于编写高效、健壮的 Go 代码至关重要。
1、数值、浮点型、和字符类型
1、布尔类型 (Boolean)
布尔类型用于表示逻辑值,它只有两个可能的值:true 或 false。这在所有编程语言中都非常基础和通用。
- 关键字 :
bool - 值 :
true、false(均为小写)
2、数值类型 (Numeric)
Go 语言的数值类型非常丰富,提供了多种大小和精度的选择,让开发者能在性能和内存占用之间做出精细的权衡。
2.1 整数类型 (Integer)
-
有符号整数 (
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 是一种强类型语言,不同类型的整数之间不能直接赋值,必须进行显式转换。

注意:从大范围类型向小范围类型转换时,可能会发生数据丢失(精度溢出)。
2.2 浮点数类型 (Floating-Point)
浮点数用于表示小数。
float32: 32位浮点数,精度较低。float64: 64位浮点数,精度更高,是默认的小数类型。
它们的表示范围远大于整数类型,例如 float64 可以表示高达 1.8 x 10^308 的数值。
2.3 字符类型 (byte 和 rune)
Go 语言没有专门的 char 类型,而是用 byte 和 rune 来处理字符。
byte:- 它是
uint8的别名,占用 1 个字节。 - 主要用于表示 ASCII 字符(如英文字母、数字)。
- 其本质是一个整数,可以直接进行数学运算。
- 它是


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


3、字符串类型 (String)
字符串是字符的只读序列,在 Go 中使用 string 关键字定义。
- 定义 :使用双引号
""包裹。 - 特性:字符串是不可变的,一旦创建,其内容不能被修改。

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

注意:将浮点型转换为整型时,小数部分会被直接舍弃(截断),而不是四舍五入。
1.2 类型别名与严格性
Go 允许使用 type 关键字为现有类型定义一个别名,这有助于提高代码的可读性。例如,byte 是 uint8 的别名,rune 是 int32 的别名。
当定义一个别名时,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 提供了功能更强大的 Parse 和 Format 系列函数。
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。
- 它能识别 "1", "t", "T", "true", "TRUE", "True" 为

2、Format系列:其他类型 -> 字符串
Format 系列函数是 Parse 的逆操作,它将不同的数据类型转换为字符串,并允许进行精细的格式化控制。
FormatFloat: 将浮点数转换为字符串。fmt参数是格式化字符(如 'f' 表示标准小数,'e' 表示科学计数法)。prec控制精度(小数位数)。
FormatInt: 将整数转换为指定进制的字符串。base参数指定目标进制(2 到 36)。
FormatBool: 将布尔值转换为字符串 "true" 或 "false"。

总结与选择
- 简单场景 : 当你只需要在十进制整数 和字符串 之间进行转换时,
strconv.Atoi()和strconv.Itoa()是最简洁、最常用的选择。 - 复杂场景 : 当你需要处理浮点数 、布尔值 ,或者需要在不同进制 之间转换时,应使用功能更强大的
Parse和Format系列函数。这些函数提供了必要的参数来精确控制转换过程和输出格式。
掌握这些类型转换方法是编写健壮、高效 Go 程序的基础。
4、运算符和表达式
Go 语言运算符和表达式
运算符是用于执行数据运算、赋值和比较的特殊符号。Go 语言的运算符与其他主流编程语言(如 C++ 或 Java)非常相似,理解它们是编写任何程序的基础。
1、算术运算符
算术运算符用于执行基本的数学运算。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ |
相加 | a + b |
- |
相减 | a - b |
* |
相乘 | a * b |
/ |
相除 | a / b |
% |
取余(取模) | a % b |
++ |
自增 | a++ |
-- |
自减 | a-- |
注意:
+运算符也可用于拼接字符串。++和--在 Go 中是语句,而不是表达式。因此,你不能写c := a++这样的代码。

2、关系运算符
关系运算符用于比较两个值,其结果总是一个布尔值(true 或 false)。
| 运算符 | 描述 |
|---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
3、逻辑运算符
逻辑运算符常用于组合多个关系表达式,其结果也是一个布尔值。
| 运算符 | 描述 |
|---|---|
&& |
逻辑与 (AND),两者都为 true 时,结果为 true |
| || | 左右条件任意一个为true ,结果即为true |
! |
逻辑非 (NOT),反转布尔值 |

4、位运算符
位运算符对整数在内存中的二进制位进行操作,常用于底层代码优化和数据处理,因为它们的执行效率非常高。
| 运算符 | 描述 |
|---|---|
& |
按位与 (AND) |
| | | 按位或(|) |
^ |
按位异或 (XOR) |
<< |
左移 |
>> |
右移 |
按位与 (&) 示例: 它会对两个数字的二进制表示的每一位进行比较,只有当两个相应的位都为 1 时,结果的该位才为 1。
例如,60 & 13 的计算过程如下:
60的二进制是0011 110013的二进制是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、运算符优先级
当一个表达式中包含多个运算符时,会根据优先级来决定计算顺序。下表从高到低排列了运算符的优先级。
| 优先级 | 运算符 |
|---|---|
| 最高 | ^ ! |
* / % << >> & |
|
+ - ` |
|
== != < <= > >= |
|
&& |
|
| 最低 | , |
在编写复杂表达式时,建议使用括号 () 来明确指定运算顺序,这能极大地提高代码的可读性。

