Go 编程 | 连载 06 - 基本数据类型转换(strconv)

1,418 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

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

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

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 类型而不报任何错误,查看源码注释

image.png

除了 "NaN" 之外,还有 "Inf""Infinity",这点要尤其注意。

ParseInt()

ParseInt() 函数可以将字符串转换为 int 类型的数据,该函数有三个参数,第一个是要转换的字符串;第二个参数是字符串所表示数字的进制形式,第三个参数是指要转换成 int8、int16、int32 或 int64 既所占的字节数大小。

ParseInt() 函数返回两个值,第一个是 int64 类型的整数,第二个是转换过程中的错误,如果 err 为 nil,说明转换成功。

image.png

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() 的返回值的含义一致。

image.png

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

image.png

func main() {

   res := strconv.Itoa(16)
   fmt.Printf("%#v, %v, %T\n", res, res, res)

}

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

"16", 16, string