Golang深入浅出之-Go数据类型详解:整型、浮点型与布尔型

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 【4月更文挑战第20天】Go语言基础数据类型包括整型(有符号和无符号,如`int8`、`uint32`)、浮点型(`float32`、`float64`)和布尔型(`true`、`false`)。理解它们的范围和特性,以及注意溢出、精度损失、类型转换等问题,是编写高效Go代码的关键。例如,整型溢出可能导致模运算,浮点数比较可能有精度误差,布尔型不应用于数值计算。了解这些易错点,能帮助写出更健壮的代码。

Go语言提供了丰富的数据类型,其中整型、浮点型和布尔型是最基础也是最常用的数值类型。理解这些类型的特点、范围以及相关操作,有助于编写高效、正确的Go代码。本文将深入浅出地解析这三种数据类型,并指出常见问题与易错点,配以代码示例供读者参考。
image.png

一、整型

Go语言中的整型分为有符号整型和无符号整型,具体包括:

  • 有符号整型int8int16int32int64int(平台相关)
  • 无符号整型uint8(别名byte)、uint16uint32uint64uint(平台相关)

各类型所占位数与取值范围如下:

类型 占位数 取值范围
int8 / uint8 8 bit -128 至 127 / 0 至 255
int16 / uint16 16 bit -32768 至 32767 / 0 至 65535
int32 / uint32 32 bit -2^31 至 2^31-1 / 0 至 2^32-1
int64 / uint64 64 bit -2^63 至 2^63-1 / 0 至 2^64-1
int / uint 平台相关 取决于操作系统和处理器架构

常见问题与易错点

  1. 溢出:超出整型范围的操作可能导致溢出。Go语言不会自动检测整数溢出,而是默默地进行模运算。应避免潜在的溢出风险,或使用math/big包处理大整数。
   var maxUint8 uint8 = 255
   maxUint8 += 1 // maxUint8现在为0,发生了溢出
  1. 类型转换:不同类型之间需要显式转换,否则会引发编译错误。确保转换目标类型足够容纳源类型的数据。
   var i int32 = 1000
   var u uint8 = uint8(i) // 转换前需确保i的值在uint8范围内

二、浮点型

Go语言的浮点型包括:

  • 单精度浮点型float32
  • 双精度浮点型float64

取值范围与精度如下:

类型 占位数 取值范围 精度
float32 32 bit ±1.18e-38 to ±3.40e+38 约6位小数
float64 64 bit ±2.23e-308 to ±1.79e+308 约15位小数

常见问题与易错点

  1. 精度损失:浮点数并非精确表示,进行某些操作(如除法、比较)时可能引入不可预期的精度误差。对于要求高精度计算的场景,考虑使用math/big包提供的Rat类型。
   var a, b float64 = 0.1, 0.2
   fmt.Println(a + b == 0.3) // 输出false,由于精度损失导致相等判断失败
  1. NaN与无穷:浮点数存在特殊值NaN(Not-a-Number)和正负无穷。涉及这些值的比较和运算需特别留意:
   var nan float64 = math.NaN()
   fmt.Println(nan == nan) // 输出false,NaN不等于任何值,包括自身

   var inf float64 = math.Inf(1) // 正无穷
   fmt.Println(inf > 0) // 输出true,正无穷大于任何有限实数

三、布尔型

布尔型在Go语言中表示真(true)或假(false)两种状态。布尔值常用于条件判断、逻辑运算以及标志变量。

常见问题与易错点

  1. 非布尔类型与布尔操作:只有布尔值才能参与逻辑运算。误将非布尔值用于条件判断或逻辑运算会导致编译错误。
   var num int = 0
   if num {
    // 编译错误:non-bool num (type int) used as if condition
   }
  1. 滥用布尔值:避免将布尔型作为数值类型使用,如进行算术运算或赋值给非布尔变量。这种做法违反了类型系统的初衷,降低了代码可读性。
   var flag bool = true
   var count int = flag // 避免此类赋值,应使用if或switch判断布尔值并相应处理

总结,理解并熟练运用Go语言中的整型、浮点型和布尔型,识别并规避相关常见问题与易错点,是编写高质量Go代码的基础。通过实践与学习,不断提升对这些基础数据类型的掌控能力,为后续复杂编程任务打下坚实基础。

目录
相关文章
|
2月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
44 4
|
2月前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
38 9
|
2月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
39 3
|
4月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
80 3
|
4月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
36 2
|
4月前
|
Go
Golang语言基础数据类型之字符串常用的操作
这篇文章介绍了Golang语言中字符串的定义、常用操作,包括字符串长度查看、遍历、类型转换、子串统计、比较、查找位置、替换、切割、大小写转换、剔除字符、前缀后缀判断、拼接、子串包含判断以及字符串join操作,同时提供了官方文档的查看方法。
40 1
|
4月前
|
存储 编译器 Go
Go to Learn Go之基本数据类型
Go to Learn Go之基本数据类型
39 0
|
4月前
|
Go
Golang语言高级数据类型之指针篇
这篇文章详细讲解了Golang语言中的指针概念、指针地址和类型、定义指针变量、指针的细节操作、指针传值,以及内置函数new和make的用法和它们之间的区别。
34 0