二、 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