golang是强类型语言,有强制类型转换,但是不同于Java语言所使用的强制类型转换。
golang强制类型转换golang语言中分为类型转换(type conversion)、类型断言(type assertion)和指针类型转换。
类型断言package main
import "fmt"
func main() {
var a interface{} =10
t,ok:= a.(int)
if ok{
fmt.Println("int",t)
}
t2,ok:= a.(float32)
if ok{
fmt.Println("float32",t2)
}
}
打印结果是:int 10
因为 golang 自动推断 a 是 int 类型。
(这个更像是Java的强制类型转换,认为变量 a 是 int 类型,就强转为 int 类型来使用)
类型转换
package main
import "fmt"
func main() {
var a float32 = 5.6
var b int = 10
fmt.Println (a * float32(b))
}
代码段中的 float32(b) 就是第二种强制类型转换, 普通变量类型int,float,string 都可以使用 type (a)这种形式来进行强制类型转换,比如
var a int32 = 10
var b int64 = int64(a)
var c float32 = 12.3
var d float64 =float64(c)
这种类型转换形式更像是Java的通过构造类的构造方法创建一个新类型对象。在Java语法中不属于强制类型转换。
指针类型转换package main
func main() {
var a int = 10
var p *int =&a
var c *int64
c= (*int64)(p)
}
这样的代码是错误的,编译器会提示cannot convert p (type *int) to type *int64
指针的强制类型转换需要用到unsafe包中的函数实现
package main
import "unsafe"
import "fmt"
func main() {
var a int =10
var b *int =&a
var c *int64 = (*int64)(unsafe.Pointer(b))
fmt.Println(*c)
}
总结
golang中的强制类型转换有三种语法形式,分别是 类型断言,类型转换,指针类型转换,语法上类型断言和指针类型转换和Java比较像。
golang和Java的强制类型转换可以对比着理解,但是不同语言设计思想不同,不能硬类比。