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


相关文章
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
59 4
|
2月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
43 1
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
47 7
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
Go
go语言常量的类型
【10月更文挑战第20天】
31 2
|
3月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
64 7
|
3月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
4月前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
4月前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
4月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)