Go 语言的基础数据类型

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

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

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

1、布尔类型 (Boolean)

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

  • 关键字 :bool
  • 值 :true、false (均为小写)

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,则浪费了一半的表示范围来存储无意义的负数。

特殊的 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。

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、运算符优先级

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

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

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

相关推荐
xcl09255 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
龙腾AI白云7 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
zzj_2626107 小时前
MySQL常用操作
数据库·mysql
卓怡学长7 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn7 小时前
Spring 注解使用详解
java·spring
其实防守也摸鱼7 小时前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化
一条小小yu7 小时前
Spring IoC的理解
java·后端·spring
haerapi7 小时前
把 PostgreSQL 复制巡检做成可审计闭环:确定性采集、阈值判定与受控模型归纳
数据库·postgresql
落魄实习生8 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai