在 Golang 中,类型转换用于在不同类型之间转换值。类型转换主要有两种方式:
- 显式类型转换:使用目标类型() 表达式进行显式类型转换。
例如:
var a int32 = 10
var b int8
b = int8(a) // 显式类型转换,将int32转换为int8
这里将 int32 类型的 a 显式转换为 int8 类型,赋值给 b。
- 隐式类型转换:当两个类型之间有明确的转换关系时,golang 会自动进行隐式类型转换。
例如:
var a int = 10
var b float32
b = a // 隐式类型转换,int可以自动转换为float32
int 类型的值可以隐式转换为 float32 类型,所以这里 a 自动转换为 float32 类型,赋值给 b。
规则:
- 不同类型的整数(int8、int16、int32、int64)之间可以隐式转换
- 整型和浮点型之间可以隐式转换
- 整型、浮点型都可以隐式转换为interface{}
- 可以对字符串和字节切片进行显式类型转换
不能进行类型转换的情况:
- 不同类型的浮点数(float32和float64)之间不允许隐式转换
- 复数类型(complex64、complex128)不允许与其他类型进行隐式转换
- 指针类型不允许与其他类型进行隐式转换
- 接口类型之间不允许任何类型的转换
例外:可以对接口类型进行类型断言,来获取其具体实现类型。
所以类型转换允许在不同类型的值之间进行转换,这给我们的程序带来了更高的灵活性。但是类型转换也可能导致信息损失或精度降低,所以应该遵循“尽可能使用最 matching 的类型”的原则。在有必要进行类型转换时,应该谨慎地考虑各类型之间的精度和可表示范围,选择最适当的方式进行转换。