Go 编程 | 连载 03 - 布尔类型和数值类型

简介: Go 编程 | 连载 03 - 布尔类型和数值类型

一、Go 语言中的基本数据类型

Go 语言中的基本数据类型包含了三种,分别是 布尔类型数值类型 以及 字符串 类型三种,其中数值类型又分为 整数类型浮点数类型复数类型

二、Go 语言中的布尔类型

Go 中的布尔类型使用符号 bool 来表示,布尔值只有 true 和 false 两个值,占用 1 个字节。布尔类型常用流程控制语句以及函数返回值。

func main() {
   isOk := true
   isClosed := false
   fmt.Println("bool 类型数据所占的字节大小为:", unsafe.Sizeof(isOk))
   fmt.Println("bool 类型数据所占的字节大小为:", unsafe.Sizeof(isClosed))
   // 获取变量类型
   fmt.Printf("isOk 变量的类型是:%T\n", isOk)
   fmt.Printf("isClosed 变量的类型是:%T\n", isClosed) 
}
复制代码

执行上述代码,输出结果如下:

bool 类型数据 true 所占的字节大小为: 1
bool 类型数据 false 所占的字节大小为: 1
isOk 变量的类型是:bool
isClosed 变量的类型是:bool
复制代码

这里用到了 unsafe 包下的 Sizeof 函数,用于获取数据所占的字节大小。可以看出 true 和 false 都是占用了 1 个字节。

获取变量类型要使用格式化输出函数 fmt.Printf,使用 %T 来表示输出变量的类型,其他常用的占位符还有 %v 格式化输出变量的值,fmt.Printf 函数不会自动换行。

Go 中的布尔类型是不能够与数字、字符串通过 bool、int、string 这种形式进行转换,但是可以通过 strconv 标准库的 ParseBool 函数 和 FormatBool 函数实现和字符串的互相转换。

44555a733323435f999752a004de1e53_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

三、Go 语言中的数值类型

整数类型

整数类型占用字节大小以及有无符号来划分可以分为以下几种:

  • int8 有符号 8 位整型 (-128 到 127)
  • int16 有符号 16 位整型 (-32768 到 32767)
  • int32 有符号 32 位整型 (-2147483648 到 2147483647)
  • int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
  • uint8 无符号 8 位整型 (0 到 255) 8位都用于表示数值:
  • uint16 无符号 16 位整型 (0 到 65535)
  • uint32 无符号 32 位整型 (0 到 4294967295)
  • uint64 无符号 64 位整型 (0 到 18446744073709551615)

不同的整型所占字节大小

func main() {
   var a int8 = -10
   var b int16 = -20
   var c int32 = -30
   var d int64 = -80
   var e uint8 = 10
   var f uint16 = 20
   var g uint32 = 30
   var h uint64 = 80
   fmt.Println("int8 和 uint8 所占字节为:", unsafe.Sizeof(a), unsafe.Sizeof(e))
   fmt.Println("int16 和 uint16 所占字节为:", unsafe.Sizeof(b), unsafe.Sizeof(f))
   fmt.Println("int32 和 uint32 所占字节为:", unsafe.Sizeof(c), unsafe.Sizeof(g))
   fmt.Println("int64 和 uint64 所占字节为:", unsafe.Sizeof(d), unsafe.Sizeof(h))
}
复制代码

执行上述代码,输出结果如下:

int8 和 uint8 所占字节为: 1 1
int16 和 uint16 所占字节为: 2 2
int32 和 uint32 所占字节为: 4 4
int64 和 uint64 所占字节为: 8 8
复制代码

int 与 unit 类型

除了上面提到的占用不同字节大小的整数值类型外,intuint 也可以表示整数,它是一种动态类型,所占字节大小取决于操作系统的位数:

  • 如果是32位操作系统,int类型的大小就是4字节
  • 如果是64位操作系统,int类型的大小就是8个字节
func main() {
   var z int = 10
   fmt.Printf("变量 z 的类型为:%T, 所占字节大小为:%v", z, unsafe.Sizeof(z))
}
复制代码

浮点数类型

Go 中浮点数按照字节大小划分可以分为 float32float64

func main() {
   var y float32 = 1.0
   var z float64 = 2.0
   fmt.Println("float32 所占的字节大小为:", unsafe.Sizeof(y))
   fmt.Println("float64 所占的字节大小为:", unsafe.Sizeof(z))
   fmt.Println("float32 可表示的最大数为:", math.MaxFloat32)
   fmt.Println("float32 可表示的最大数为:", math.MaxFloat64)
}
复制代码

执行上述代码,输出结果如下:

float32 所占的字节大小为: 4
float64 所占的字节大小为: 8
float32 可表示的最大数为: 3.4028234663852886e+38
float32 可表示的最大数为: 1.7976931348623157e+308
复制代码

复数类型

Go语言中复数的类型有两种,分别是  complex128(64 位实数和虚数)和 complex64(32 位实数和虚数),其中 complex128 为复数的默认类型。

复数的值由三部分组成 RE + IMi,其中 RE 是实数部分,IM 是虚数部分,RE 和 IM 均为 float 类型,而最后的 i 是虚数单位。

func main() {
   var x complex64 = complex(1, 2)
   var y complex64 = complex(3, 4)
   fmt.Println(x * y)
   fmt.Println(real(x * y))
   fmt.Println(imag(x * y))
}
复制代码

执行上述代码,输出结果如下:

(-5+10i)
-5
10
复制代码

real(z)来获得该复数的实部,通过imag(z) 获得该复数的虚部。

数值类型的操作

Go 中数值相关的操作大部分都在 math 包下,包含了大量数值类型的计算操作。

cf33af8af60b473da238c89ee5de8e2f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

常用的操作如下:

函数名 函数说明
Ceil 函数 向上取整
Floor 函数 向下取整
Trunc 函数 获取参数的整数部分,与 Floor 函数一样,向下取整
Abs 函数 获取参数的绝对值
Max 函数 获取两个参数中的最大值
Min 函数 获取两个参数中的最小值
Dim 函数 获取两个参数相减的值和 0 比较的最大值
Sqrt 函数 获取入参的平方根
Cbrt 函数 获取入参的立方根
Pow 函数 求幂计算,获取 x 的 y 次方的值
func main() {
   var a = 10.0
   // 取绝对值
   fmt.Println(math.Abs(a))
   var b = 64.0
   // 取平方根
   fmt.Println(math.Sqrt(b))
   var c = 3.0
   // 幂次方,获取 a 的 c 次方值
   fmt.Println(math.Pow(a, c))
   var d = 27.0
   // 开立方根
   fmt.Println(math.Cbrt(d))
   var e = 5.9
   // 向上取整
   fmt.Println(math.Ceil(e))
   var f = 7.0
   // 向下取整
   fmt.Println(math.Floor(f))
   // 比较大小 
   fmt.Println(math.Max(e, f))
   fmt.Println(math.Min(e, f))
}
复制代码

执行上述代码,输出结果如下:

10
8
1000
3
6
7
7
5.9
复制代码

math 包下还有一个 rand 包,用户生成随机数。

e7d103aa00204f97a4853bbd7a52b882_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


相关文章
|
3月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
228 3
|
8月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
233 15
|
8月前
|
设计模式 缓存 算法
Go如何进行高质量编程与性能调优实践
本文介绍了Go语言高质量编程与性能调优的实践方法。高质量编程包括良好的编码习惯(如清晰注释、命名规范)、代码风格与设计(如MVC模式)、简洁明了的代码原则,以及单元测试与代码重构的重要性。性能调优方面,涵盖算法优化、数据结构选择、I/O优化、内存管理、并行与并发处理优化及代码层面的改进。通过这些方法,可有效提升代码质量和系统性能。
182 13
|
7月前
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
282 2
|
8月前
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
8月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
213 10
|
11月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
176 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
375 4
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
247 7
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
228 1