Go 编程 | 连载 05 - 基本数据类型转换

简介: Go 编程 | 连载 05 - 基本数据类型转换

一、基本数据类型转换

强制转换

Go 中基本数据类型的强制转换值指的是通过 int、int32、string、float32、float64... 等基本数据类型的标识符来实现的数据类型转换。

func main() {
   // 数据类型的简单转换
   // 浮点数和整数之间可以转换
   a := 3.0
   b := int(a)
   fmt.Printf("%T\n", b)
   c := 3
   d := float64(c)
   fmt.Printf("%T\n", d)
   // 整数可以转为字符串,但是只包含整数的字符串不能通过 int 转为整数
   // e := "3"
   // Cannot convert expression of type string to type int
   // f := int(e)
   // fmt.Printf("%T\n", f)
   e := 3
   g := string(e)
   fmt.Printf("%T\n", g)
   // 浮点数和字符串之间不可通过 float64 和 string 实现转换
   // h := "3.0"
   // Cannot convert expression of type string to type float64
   //i := float64(h)
   //fmt.Printf("%T\n", i)
   //j := 3.0
   // Cannot convert expression of type float64 to type string
   //k := string(j)
   //fmt.Printf("%T\n", k)
}
复制代码

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

int
float64
string
复制代码

要注意高精度转为低精度时会丢失精度,如 int64 转为 int32等。

如果底层数据类型相同也算是可以实现强制类型转换的。

func main() {
   // 自定义一个类型,底层为 INT
   type BigInt int
   var a BigInt = 5
   var b int = int(a)
   var c BigInt = BigInt(b)
   fmt.Printf("%T\n", b)
   fmt.Printf("%T\n", c)
}
复制代码

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

int
main.BigInt
复制代码

上述代码中使用 type 关键字定义一个 BigInt 类型的结构,底层是 int,可以通过 int 或者 BigInt 标识符来实现两个数据类型之间的强制转换。

隐式转换

通过数据类型标识符来实现的转换成为强制转换或者显示转换,而隐式转换指不通过类型标识符即可实现的数据类型的转换。

Go 中常量和变量之间支持隐式转换,变量之间的不支持隐式转换。

常量和变量之间的隐式装换,要在常量和变量之间的值相等的情况下进行

func main() {
   var a int = 3.0
   fmt.Printf("%v, %T", a, a) // 输出 3, int
   var b int = 3.14
   fmt.Printf("%T", b) // 报错 cannot use 3.14 (untyped float constant) as int value in variable declaration (truncated)
}
复制代码

不同数据类型变量之间不支持隐式转换

image.png

使底层数据类型相同也不可以进行隐式转换,比如int32和int64之间,但是可以进行强制类型转换。

二、 strconv 标准库实现的基本数据类型转换

从上述代码中可以确定,字符串和数字之间是不能通过 int、float32、string 这种简单的方式实现互相转换的,要想实现这种跨类型的互相转换,就需要使用到 Go 的 strconv 标准库来实现。

Go 官方文档中对 Package strconv 的描述是 strconv 标准库实现了基本数据类型和其字符串表示的相互转换。

Package strconv implements conversions to and from string representations of basic data types.

ParseXxx 函数

strconv 标准库中的 ParseXxx 函数可以实现将字符串转为其他类型(int、float、bool)的值,如 ParseBool()、ParseFloat()、ParseInt()、ParseUint() 以及 Atoi()。

ParseBool()

ParseBool() 函数接收一个字符串类型的数据作为参数,并且返回两个值,一个是转换之后 bool 类型的值,另一个是转换出现的错误 error,如果转换成功,则 error 类型输出的值为 nil

package main
import (
   "fmt"
   "strconv"
)
func main() {
   // ParseBool 函数
   bool_data_01, err_01 := strconv.ParseBool("true")
   fmt.Printf("转换错误信息:%v, 转换后 bool_data_01 变量的类型是:%T\n", err_01, bool_data_01)
   bool_data_02, err_02 := strconv.ParseBool("stark")
   fmt.Printf("转换错误信息:%v, 转换后 bool_data_02 变量的类型是:%T\n", err_02, bool_data_02)
   bool_data_03, err_03 := strconv.ParseBool("false")
   fmt.Printf("转换错误信息:%v, 转换后 bool_data_03 变量的类型是:%T\n", err_03, bool_data_03)
   bool_data_04, err_04 := strconv.ParseBool("False")
   fmt.Printf("转换错误信息:%v, 转换后 bool_data_04 变量的类型是:%T\n", err_04, bool_data_04)
   bool_data_05, err_05 := strconv.ParseBool("2")
   fmt.Printf("转换错误信息:%v, 转换后 bool_data_05 变量的类型是:%T\n", err_05, bool_data_05)
}
复制代码

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

转换错误信息:<nil>, 转换后 bool_data_01 变量的类型是:bool
转换错误信息:strconv.ParseBool: parsing "stark": invalid syntax, 转换后 bool_data_02 变量的类型是:bool
转换错误信息:<nil>, 转换后 bool_data_03 变量的类型是:bool
转换错误信息:<nil>, 转换后 bool_data_04 变量的类型是:bool
转换错误信息:strconv.ParseBool: parsing "2": invalid syntax, 转换后 bool_data_05 变量的类型是:bool
复制代码

查看 ParseBool() 函数的源码可以发现,该函数支持将多种表示 True 的字符串转换为 bool 类型,包括 "1","t","T","true","TRUE","True",除了 1 和 0 之外不支持将其他数字形式的 string 转换为 bool。

image.png


相关文章
|
15天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
30 9
|
15天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
31 7
|
21天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
29天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
49 7
|
1月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
1月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
2月前
|
存储 编译器 Go
Go to Learn Go之基本数据类型
Go to Learn Go之基本数据类型
27 0
|
6月前
|
编译器 Go C语言
go语言基本数据类型和变量
go语言基本数据类型和变量
58 0
|
Go 存储
02-Go语言数据类型与变量
Go基本类型 布尔型: bool - 长度: 1字节 - 取值范围: true,false - 注意事项: 不可以用数字代表true或false 整型: int/uint - 根据运行平台可能为32或64 8位整型:int8/uint8 - 长度: 1字节 - 取值范围: -128~127/0-25...
924 0