Golang 的类型转换规则是什么?

Golang 中类型转换有以下规则:

  1. 只可以向更广泛的类型转换
    比如:
var a int = 10
var b float64 = float64(a) // 可以

这里向 float64 进行转换。 float64 比 int 更宽泛。

  1. 不能向更具体的类型转换
    比如:
var b float64 = 10.5
var a int = int(b) // 编译错误!
float64 to int , int 更具体。
  1. 只能转换重叠部分的类型
    比如:
type MyInt int
var a int = 10
var b MyInt = MyInt(a) // 可以

这里 int 和 MyInt 有重叠。

  1. 接口可以转换为具体类型
var a interface{} = "hello"
var s string = s.(string)
  1. 指针也可以相互转换
var a *int 
var b *float64 = (*float64)(a)
  1. 只有同种基础类型才能转换
    比如 int 和 float 是可以相互转换的。

总的来说 Go 中类型转换的规则主要有:

  1. 只能向更广泛的类型转换
  2. 不能向更具体的类型转换
  3. 只能转换有重叠部分的类型
  4. 接口可以转换为具体类型
  5. 指针也可以相互转换
  6. 基础类型间才能转换

这些规则可以很大程度地保证类型安全。当然 Go 还提供了类型断言来更加安全地转换类型。