面试题答案
一键面试-
整数类型转换导致精度丢失
- 场景:将一个较大范围的整数类型转换为较小范围的整数类型时,可能会丢失数据的高位部分。例如,将
int64
类型转换为int8
类型。
package main import ( "fmt" ) func main() { var num int64 = 128 var num8 int8 = int8(num) fmt.Println(num8) }
- 原因:
int8
类型的取值范围是-128
到127
,128
超出了int8
的表示范围,因此转换后会截断数据,导致结果为-128
(这是因为在计算机中以补码形式存储整数,溢出后会得到错误的值)。
- 场景:将一个较大范围的整数类型转换为较小范围的整数类型时,可能会丢失数据的高位部分。例如,将
-
浮点数类型转换导致精度丢失
- 场景:将浮点数转换为整数时,小数部分会被截断。例如,将
float64
类型转换为int
类型。
package main import ( "fmt" ) func main() { var num float64 = 3.14 var numInt int = int(num) fmt.Println(numInt) }
- 原因:整数类型不能存储小数部分,所以在转换时会直接丢弃小数部分,只保留整数部分。
- 场景:将浮点数转换为整数时,小数部分会被截断。例如,将
-
指针类型转换导致未定义行为
- 场景:不正确地将一种指针类型转换为另一种指针类型,并且在转换后通过指针访问数据。例如,将指向
int
的指针转换为指向struct
的指针。
package main import ( "fmt" ) type MyStruct struct { value int } func main() { var num int = 10 var ptr *int = &num var structPtr *MyStruct = (*MyStruct)(unsafe.Pointer(ptr)) fmt.Println(structPtr.value) }
- 原因:Go语言的类型系统不允许随意进行指针类型转换,这样的转换绕过了类型安全检查。不同类型的内存布局不同,转换后访问数据可能会访问到未初始化的内存区域或者破坏内存结构,导致未定义行为。在实际应用中,这种情况应该避免,除非使用
unsafe
包并且非常清楚其后果。但即使使用unsafe
包,也需要谨慎操作以确保内存安全。
- 场景:不正确地将一种指针类型转换为另一种指针类型,并且在转换后通过指针访问数据。例如,将指向