携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
二、 strconv 标准库实现的基本数据类型转换
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"
,这点要尤其注意。
ParseInt()
ParseInt() 函数可以将字符串转换为 int 类型的数据,该函数有三个参数,第一个是要转换的字符串;第二个参数是字符串所表示数字的进制形式
,第三个参数是指要转换成 int8、int16、int32 或 int64 既所占的字节数大小。
ParseInt() 函数返回两个值,第一个是 int64 类型的整数,第二个是转换过程中的错误,如果 err 为 nil,说明转换成功。
func main() {
// ParseInt()
res, err := strconv.ParseInt("12", 8, 64)
fmt.Printf("%v, %T, %v\n", res, res, err)
res2, err2 := strconv.ParseInt("12", 16, 64)
fmt.Printf("%v, %T, %v\n", res2, res2, err2)
res3, err3 := strconv.ParseInt("zulu", 10, 64)
fmt.Printf("%v, %T, %v\n", res3, res3, err3)
}
执行上述代码,输出结果如下:
10, int64, <nil>
18, int64, <nil>
0, int64, strconv.ParseInt: parsing "zulu": invalid syntax
如果转换出现问题,则会返回该类型的初识值,int 类型的初始值就是 0。
如果第二个参数为 0, ParseInt() 函数也可以根据输入自动判断类型字符串所表示数字的进制形式
func main() {
// ParseInt()
res, err := strconv.ParseInt("012", 0, 64)
fmt.Printf("%v, %T, %v\n", res, res, err)
res2, err2 := strconv.ParseInt("0X12", 0, 64)
fmt.Printf("%v, %T, %v\n", res2, res2, err2)
}
执行上述代码,输出结果如下:
10, int64, <nil>
18, int64, <nil>
Atoi() 函数
Atoi() 函数就等同于 ParseInt() 函数,可以将字符串转换为整数,并默认字符串所表示的整数为十进制,所以 Atoi() 函数只需要一个参数即可,那就是要转换的字符串。
该函数同样返回两个值,这两个返回值所表示的含义与 ParseInt() 的返回值的含义一致。
func main() {
// Atoi()
res, err := strconv.Atoi("100")
fmt.Printf("%v, %T, %v\n", res, res, err)
res2, err2 := strconv.ParseInt("12138", 0, 64)
fmt.Printf("%v, %T, %v\n", res2, res2, err2)
}
执行上述代码,输出结果如下:
100, int, <nil>
12138, int64, <nil>
FormatXxx 函数
FormatXxx 形式的函数可以将 int、float、bool 类型转换为 string 类型,具体的转换函数有:FormatBool()、FormatFloat()、FormatInt()、FormatUint() 以及 Itoa()。
// 第一个参数表示要转换的整数,第二个表示转换成什么进制的形式
func FormatInt(i int64, base int) string {}
// 直接输出 bool 类型的值即可
func FormatBool(b bool) string {}
// 第一个参数表示要转换的 浮点数,第二个参数 fmt 表示格式,可选 'f', 'b'(二进制形式), 'e'(指数形式), 'E', 'g'(), 'G'
// 第三个参数表示精度,保留几位小数,第四个参数表示转成的类型所占字节大小,有 32 和 64
func FormatFloat(f float64, fmt byte, prec, bitSize int) string {}
func main() {
res := strconv.FormatInt(16, 10)
fmt.Printf("%v, %T\n", res, res)
res2 := strconv.FormatBool(false)
fmt.Printf("%v, %T\n", res2, res2)
res3 := strconv.FormatFloat(3.1415, 'f', 2, 64)
fmt.Printf("%v, %T\n", res3, res3)
}
执行上述代码,输出结果如下:
16, string
false, string
3.14, string
Itoa() 函数
Itoa() 函数就等于 FormatInt() 函数的第二个参数为默认为 10
func main() {
res := strconv.Itoa(16)
fmt.Printf("%#v, %v, %T\n", res, res, res)
}
执行上述代码,输出结果如下:
"16", 16, string