MST

星途 面试题库

面试题:Go语言中整数类型转换的常见陷阱

在Go语言中,将一个较大范围的整数类型(如int64)转换为较小范围的整数类型(如int8)时,可能会出现什么陷阱?请举例说明,并阐述如何规避这种陷阱。
48.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 可能出现的陷阱
    • 当将较大范围的整数类型(如int64)转换为较小范围的整数类型(如int8)时,可能会发生数据截断。因为int8的范围是-128127,如果int64的值超出这个范围,转换后的值将是原值对int8类型范围取模后的结果,导致数据不准确。
  2. 举例说明
package main

import (
    "fmt"
)

func main() {
    var num int64 = 200
    var smallNum int8 = int8(num)
    fmt.Printf("转换前: %d, 转换后: %d\n", num, smallNum)
}

在上述代码中,int64类型的num值为200,超出了int8的范围。当转换为int8类型时,200 % 256 = -56(因为int8是有符号类型,这里按照补码规则计算),输出结果为:

转换前: 200, 转换后: -56
  1. 规避这种陷阱的方法
    • 在进行转换之前,先进行范围检查。例如:
package main

import (
    "fmt"
)

func main() {
    var num int64 = 200
    if num >= -128 && num <= 127 {
        var smallNum int8 = int8(num)
        fmt.Printf("转换前: %d, 转换后: %d\n", num, smallNum)
    } else {
        fmt.Println("值超出int8范围,无法安全转换")
    }
}

这样在转换之前判断num的值是否在int8的范围内,如果在则进行转换,否则给出提示,避免了数据截断带来的错误。