一、基本数据类型简单转换
简单转换
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
Go 中不支持隐式转换,而且高精度转为低精度时会丢失精度,如 int64 转为 int32等。
二、 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()。
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。
ParseFloat()
ParseFloat() 可以将字符串转换为 float 类型,由于 float 类型分为 float32 和 float64,所有 ParseFloat() 有两个参数,第一个参数为 string,第二个参数就是 bitSize,既要转换成 float32(32 个二进制位 bit,占 4 个字节) 还是 float64(64 个二进制位 bit,占 8 个字节)。
与 ParseBool() 函数一样,ParseFloat 函数也返回两个值,一个是转换之后的 float64
类型的值,另一个是转换时的错误。
func main() {
// ParseBool 函数
float_data_01, err_01 := strconv.ParseFloat("3.14", 64)
fmt.Printf("转换错误信息:%v, 转换后 float_data_01 变量的类型是:%T, 值为:%v\n", err_01, float_data_01, float_data_01)
float_data_02, err_02 := strconv.ParseFloat("3", 64)
fmt.Printf("转换错误信息:%v, 转换后 float_data_02 变量的类型是:%T,值为:%v\n", err_02, float_data_02, float_data_02)
float_data_03, err_03 := strconv.ParseFloat("stark", 64)
fmt.Printf("转换错误信息:%v, 转换后 float_data_03 变量的类型是:%T\n", err_03, float_data_03)
float_data_04, err_04 := strconv.ParseFloat("NaN", 64)
fmt.Printf("转换错误信息:%v, 转换后 float_data_04 变量的类型是:%T, 值为:%v\n", err_04, float_data_04, float_data_04)
float_data_05, err_05 := strconv.ParseFloat("Inf", 64)
fmt.Printf("转换错误信息:%v, 转换后 float_data_04 变量的类型是:%T, 值为:%v\n", err_05, float_data_05, float_data_05)
}
执行上述代码,输出结果如下:
转换错误信息:<nil>, 转换后 float_data_01 变量的类型是:float64, 值为:3.14
转换错误信息:<nil>, 转换后 float_data_02 变量的类型是:float64,值为:3
转换错误信息:strconv.ParseFloat: parsing "stark": invalid syntax, 转换后 float_data_03 变量的类型是:float64
转换错误信息:<nil>, 转换后 float_data_04 变量的类型是:float64, 值为:NaN
转换错误信息:<nil>, 转换后 float_data_04 变量的类型是:float64, 值为:+Inf
ParseFloat() 函数可以识别 "NaN"
并转换为 float 类型而不报任何错误,查看源码注释
除了 "NaN"
之外,还有 "Inf"
、"Infinity"
,这点要尤其注意。