当前位置: 首页 > news >正文

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 是一种强类型语言,不同类型的整数之间不能直接赋值,必须进行显式转换。

image.png

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

2.2 浮点数类型 (Floating-Point)

浮点数用于表示小数。

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

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

2.3 字符类型 (byterune)

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

  • byte:
    • 它是 uint8别名,占用 1 个字节。
    • 主要用于表示 ASCII 字符(如英文字母、数字)。
    • 其本质是一个整数,可以直接进行数学运算。

image.png

image.png

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

image.png

image.png

3、字符串类型 (String)

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

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

image.png

2、基本类型的装换

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

1、数值类型之间的转换

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

1.1 整型与浮点型互转

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

image.png

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

1.2 类型别名与严格性

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

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

image.png

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

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

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

2.1 字符串转数字

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

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

image.png

image.png

2.2 数字转字符串

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

image.png

掌握这些基本的类型转换方法是编写 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

image.png

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

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

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

image.png

总结与选择

  • 简单场景: 当你只需要在十进制整数字符串之间进行转换时,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++ 这样的代码。

image.png

2、关系运算符

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

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

3、逻辑运算符

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

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

image.png

4、位运算符

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

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

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

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

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

image.png

5、赋值运算符

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

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

6、其他运算符

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

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

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

7、运算符优先级

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

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

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

相关文章:

  • 论文笔记:GTG: Generalizable Trajectory Generation Model for Urban Mobility.
  • 从UI前端到数字孪生:构建数据驱动的智能生态系统
  • 路由器压测实战:从负载均衡到DDoS防御,5步定位性能瓶颈(附脚本工具包)
  • vue 工具函数 useInfiniteScroll实现数据懒加载
  • Vue3 跨组件通信完整方案对比总结
  • 什么是状态机?状态机入门
  • Eureka 和 Feign(二)
  • 重新编译一个不支持 AVX、AVX2的 TensorFlow 1.15的python3.7的安装包
  • Spring Boot 管理系统项目解读
  • Android Studio 中使用 C++ 连接 OpenCV
  • Android studio打包生成jar包文件
  • Spring Cloud使用Eureka调用接口,超时设置(二)
  • Python爬取豆瓣短评并生成词云分析
  • 21 大刷题平台开启编程王者之路
  • Macbook如何关闭掉端口
  • 【WPF】WPF ComboBox 数据驱动不刷新?SelectedItem 与 SelectedIndex 解析!
  • 2025年SYN-CC混合攻击防御实战:某金融平台抵御800Gbps双重风暴实录
  • AI预警,数据“解码”:我们如何用技术为象牙塔筑起金融防火墙?
  • 北航将层次对称性引入多智能体强化学习,提升样本效率
  • 解决 Ruby Gem “rexml“ 版本不兼容问题 (CocoaPods/Firebase 相关错误)
  • 做淘宝图的素材搜索网站/找代写文章写手
  • wordpress整站搬家/网络推广怎么找客户资源
  • 郑州网站建设兄长好/新媒体
  • 做内贸哪个网站好/外链推广软件
  • 国际网站建设/推广普通话海报
  • 做农业需关注什么网站/2022最新热点事件及点评