2.8 类型转换
Go语言对数据的类型要求很严格,Go语言编译器不会对数据进行隐式的类型转换,只支持开发人员手动进行数据类型的转换操作。这个特性可能会让初学者感觉有点麻烦,例如整数类型和浮点类型不能混用。
Go语言数据类型转换的语法比较简单,将类型A的值转换成类型B的值的语法如下:
类型B(类型A的值)
例如,我们需要将浮点(float32)类型的变量f (值为3.14)转换成整数(int)类型的数据,则可以用int(f)将数据转成3。下面是常用的类型转换的示例程序2-22。
示例程序2-22 类型转换:chapter02\code07\type_convert.go
在示例程序2-22中,可以知道浮点(float32)类型的数据可以转成整数(int)类型,只是高精度的值转换为低精度的值时会丢失精度。同样,整数类型的数据也可以转换成浮点(float32)类型的数据。float32类型和float64类型可以互转。从第16~21行来看,类型B(类型A的值)这种转换语法无法将布尔类型转成整数类型,也不能将字符串类型"1"转换为整数类型的1。
另外,注意fmt.Printf这个函数的用法,可以用参数%.3f对浮点类型的数据保留到小数点后3位,也可以通过%-10.2f或%12.3f实现对浮点类型的数据左对齐和右对齐的设置,这种功能在打印输出多个值时用于控制对齐输出非常好用。同样的,%10s可以用于字符串的对齐输出。
注意
在Go语言中,不是所有数据类型都能转换的。另外,int(3.14)这种转换方式也会报错,因为数值常量不能通过截取转换到整数类型。
字符串类型和数值类型之间的转换在日常的开发过程中经常用到,那么在Go语言中如何实现整数类型或者浮点类型与字符串类型的互转呢?此时需要用到标准库中的strconv包(关于此包的用法,可以执行go doc strconv命令进行查看)。下面是strconv包中常用函数用法的示例程序2-23。
示例程序2-23 strconv包中常用函数用法的示例:chapter02\code07\strconv.go
在示例程序2-23中,首先需要导入包"strconv",其中的strconv.FormatFloat、strconv.Itoa和strconv.FormatBool分别可以将float64类型、整数类型和布尔类型的值转换成字符串,strconv.ParseFloat、strconv.ParseInt和strconv.FormatBool可以将字符串类型的值转换成对应的float64类型、整数类型和布尔类型的值。strconv.Itoa等同于strconv.FormatInt(int64(i), 10),strconv.Atoi等同于strconv.ParseInt(s, 10, 0)。
注意
strconv.FormatFloat这类函数会返回两个值,一个是转换的值,一个是error对象,这里用下划线(_)进行了忽略,且第一个参数只接受float64类型的参数,不能处理float32类型的值。另外,strconv.ParseInt("45.0", 10, 64)会解析报错并返回0。
在目录code07中执行命令go run strconv.go,会输出如下结果: