一、基本数据类型转换
强制转换
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) } 复制代码
不同数据类型变量之间不支持隐式转换
使底层数据类型相同也不可以进行隐式转换,比如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。