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

一、基本数据类型简单转换

简单转换

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。

image.png

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",这点要尤其注意。

猜你喜欢

转载自juejin.im/post/7126937837638778888