Golang 中类型转换有以下规则:
- 只可以向更广泛的类型转换
比如:
var a int = 10
var b float64 = float64(a) // 可以
这里向 float64 进行转换。 float64 比 int 更宽泛。
- 不能向更具体的类型转换
比如:
var b float64 = 10.5
var a int = int(b) // 编译错误!
float64 to int , int 更具体。
- 只能转换重叠部分的类型
比如:
type MyInt int
var a int = 10
var b MyInt = MyInt(a) // 可以
这里 int 和 MyInt 有重叠。
- 接口可以转换为具体类型
var a interface{} = "hello"
var s string = s.(string)
- 指针也可以相互转换
var a *int
var b *float64 = (*float64)(a)
- 只有同种基础类型才能转换
比如 int 和 float 是可以相互转换的。
总的来说 Go 中类型转换的规则主要有:
- 只能向更广泛的类型转换
- 不能向更具体的类型转换
- 只能转换有重叠部分的类型
- 接口可以转换为具体类型
- 指针也可以相互转换
- 基础类型间才能转换
这些规则可以很大程度地保证类型安全。当然 Go 还提供了类型断言来更加安全地转换类型。