golang的强制类型转换实现
golang是一种强类型语言,虽然在代码中经常看到这种写法,i:=10这其实这是编译器自动做了类型推断在编译期间。编译器会对数据进行类型检查。不同类型的数据不能赋值,不能在函数中传参。强类型语言有一些优势,很多的错误会在编译期间被检查出来,不想php和python等弱类型语言,很多错误只有运行到才能被发现。同样,强类型也有一些缺点,写代码的时候要考虑数据类型了,失去了一些灵活性。
言归正传,开始golang的类型转换问题
golang的类型转换和C/C++java等语言的类型转换还有点区别
- C/C++等语言有隐式类型转换,golang中没有
- golang中的类型转换分强制类型转换和类型断言
在C/C++中
intmain()
{
inta=5;
floatb=3.5;
printf("%f",a*b);
}
这样的代码是没有问题的,编译器隐式的把a向上转为float类型。
但是在golang中
packagemain
import"fmt"
funcmain(){
varafloat32=5.6
varbint=10
fmt.Println(a*b)
}
这样的代码会报错,因为类型不匹配
这时候需要强制类型转换
packagemain
import"fmt"
funcmain(){
varafloat32=5.6
varbint=10
fmt.Println(a*float32(b))
}
这样就不会报错了
普通变量类型int,float,string都可以使用type(a)这种形式来进行强制类型转换,比如
varaint32=10 varbint64=int64(a) varcfloat32=12.3 vardfloat64=float64(c)
golang中指针也是有类型的,
packagemain
funcmain(){
varaint=10
varp*int=&a
varc*int64
c=(*int64)(p)
}
这样的代码是错误的,编译器会提示cannotconvertp(type*int)totype*int64
指针的强制类型转换需要用到unsafe包中的函数实现
packagemain
import"unsafe"
import"fmt"
funcmain(){
varaint=10
varb*int=&a
varc*int64=(*int64)(unsafe.Pointer(b))
fmt.Println(*c)
}
golang中还有一中类型判断,类型断言
packagemain
import"fmt"
funcmain(){
varainterface{}=10
switcha.(type){
caseint:
fmt.Println("int")
casefloat32:
fmt.Println("string")
}
}
程序输出结果是int
类型断言还有一种用法
packagemain
import"fmt"
funcmain(){
varainterface{}=10
t,ok:=a.(int)
ifok{
fmt.Println("int",t)
}
t2,ok:=a.(float32)
ifok{
fmt.Println("float32",t2)
}
}
t,ok:=a.(int)有两个返回值,第一个是对应类型的值,第二个是bool类型的,类型判断是否正确。
好了,golang的强制类型转换写写到这,半夜困了,想到啥在补充吧。下次写一下golang中数字和字符串之间的转换
到此这篇关于golang的强制类型转换实现的文章就介绍到这了,更多相关golang强制类型转换内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。