服务端相关 / 15 Go 的强制类型转换

Go 语言的强制类型转换

Go 语言是一种强类型语言,而且没有隐式转换。也就是说运算符左右的变量类型必须一致,若不一致就会报错。为了使用户更加的容易使用,所以 Go 语言提供了各个类型之间强制类型转换的内置方法。

1. 整型和浮点型互相转换

整型浮点型变量之间的相互转换相对容易,只需使用强制类型转换标志 type(variable)就好了。需要注意的是,当高精度低精度类型转换的时候,会失真。即浮点型向整型转换的时候会失去其小数部分。在实际开发的过程中,我们一般要避免这两个类型的互相转换,在无法避免的场景,比如说计算浮点数和整数的和之类的情况中。需要秉持不失真原则,将低精度向高精度转换之后进行计算。

代码示例:

package main

import "fmt"

func main(){
    var a int = 10 // 声明一个整形变量 a 并给 a 赋值为 10
    var b float32 = 3.14 // 声明一个浮点型变量 b 并给 b 赋值为 3.14
 
    fmt.Printf("整型转换为浮点型:%f\n",float32(a)) // 将变量 a 强制转换为浮点型变量并打印结果
    fmt.Printf("浮点型转换为整型:%d\n",int(b)) //浮点型转为整型会失真
}

执行结果如下:

图片描述

整型和浮点型互相转换实例输出结果

2. 整形和字符串互相转换

整型和字符串类型的变量互相转换,需要依靠 Go 语言提供的转换包strconv。字符串转整型需要使用这个包的Atoi(string)方法,整型转字符串则是Itoa(int)。这种转换用得最多的就是给一些对象进行编号。比如需要给张三编号为NO.1,你可能需要将1转换为字符串之后与NO.进行拼接。

代码示例:

package main

import (
    "fmt"
    "strconv" // 在程序中导入 strconv 转环包
)

func main() {
    var a int = 10 // 定义一个整形变量并赋值为 10
    var b string = "10" // 定义一个字符串类型变量并赋值为 "10"

    fmt.Printf("整型转换为字符串:%s\n", strconv.Itoa(a))
    tmp, _ := strconv.Atoi(b)
    fmt.Printf("字符串转换为整型:%d\n", tmp)
}

执行结果如下:

图片描述

整形和字符串互相转换实例输出结果

3. 浮点型和字符串互相转换

浮点型和字符串的互相转换没有直接封装好的转换接口了,需要调用strconvs包中稍微底层一点的接口。浮点型转字符串使用FormatFloat(float64,byte,int,int)方法,字符串转换为浮点型则使用ParseFloat(...)方法。因为浮点数在存储过程中容易因为精度问题而存在误差,所以有时候会将浮点数转换为字符串进行存储。

代码示例:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    f1 := 0.123456789
    s1 := strconv.FormatFloat(f1, 'f', -1, 32)
    s2 := strconv.FormatFloat(f1, 'f', -1, 64)
    s3 := "0.123456789"
    f2, _ := strconv.ParseFloat(s3, 64)
    f3, _ := strconv.ParseFloat(s3, 32)
    fmt.Println("将浮点数转换为float32转换为string:", s2)
    fmt.Println("将float64转换为string:", s1)
    fmt.Println("将string转换为float64:", f2)
    fmt.Println("将string转换为float32再强制转换为float64:", f3)
}

执行结果:

图片描述

浮点型和字符串互相转换实例输出结果

4. 小结

本文主要学习了 Go 语言中各个数据类型的互相强制转换。主要都是依赖与 strconvs 这个第三方包。这个包中还提供了其它很多的转换方法,大家有机会可以更深入地去了解一下。在做类型转换的时候要注意:浮点型在转为整型时会失真。