这篇文章已经放到腾讯智能工作台的知识库啦,链接在这里: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 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、运算符优先级
当一个表达式中包含多个运算符时,会根据优先级来决定计算顺序。下表从高到低排列了运算符的优先级。
优先级 | 运算符 |
---|---|
最高 | ^ ! |
* / % << >> & |
|
+ - ` |
|
== != < <= > >= |
|
&& |
|
最低 | , |
在编写复杂表达式时,建议使用括号 ()
来明确指定运算顺序,这能极大地提高代码的可读性。