10 Go 类型强制转换
1 golang语言不支持类型自动转换(隐式转换),只支持强制类型转换(显示转换)
即不同类型变量之间赋值需要用到强制类型转换语法
基本语法如下:
表达式T(v),表示将变量v的值转换为T类型,把转换后的值赋值给接收变量
PS:存储范围更大的类型转换成存储范围更小的类型时,如果值超过了后者的取值范围,不会报错但是会直接截断字节,得到很奇怪的值(二进制数被从高位截断导致的)
基本使用例子:
1 // Go语言没有类型自动转换,只能显示强制类型转换 2 // 强制类型转换格式:T(v),T是需要转换的目标类型,()中是被转换的值 3 // 例子: 4 var i1 int64 5 var i2 int32 6 var i3 int8 7 i1 = 123 8 i2 = int32(i1) 9 i3 = int8(i1) 10 fmt.Printf("i1 类型为 %T ,值= %v", i1, i1) // i1 类型为 int64 ,值= 123 11 fmt.Println("") 12 fmt.Printf("i2 类型为 %T ,值= %v", i2, i2) // i2 类型为 int32 ,值= 123 13 fmt.Println("") 14 fmt.Printf("i3 类型为 %T ,值= %v", i3, i3) // i3 类型为 int8 ,值= 123 15 fmt.Println("") 16 17 // 存储范围更大的类型转换成存储范围更小的类型时,如果值超过了后者的取值范围,不会报错但是会直接截断字节,得到很奇怪的值(二进制数被从高位截断导致的) 18 // 例子: 19 var i4 int = 1000 20 var i5 int8 21 fmt.Println(i4) // 1000 22 i5 = int8(i4) 23 fmt.Println(i5) // -24
练习题1:
1 fmt.Println("练习题1:") 2 question := ` 3 var n1 int32 = 12 4 var n2 int64 5 var n3 int8 6 7 n2 = n1 + 20 8 n3 = n1 + 20 9 问: 以上代码会编译通过吗? 10 答: 会报错!如下 11 .\typeTransition.go:37:7: cannot use n1 + 20 (value of type int32) as type int64 in assignment 12 .\typeTransition.go:38:7: cannot use n1 + 20 (value of type int32) as type int8 in assignment 13 ` 14 fmt.Println(question) 15 fmt.Println("解读: 表达式 n1 + 20的结果是个int32,int32不能直接赋值给int64,修改如下:") 16 question = ` 17 var n1 int32 = 12 18 var n2 int64 19 var n3 int8 20 21 n2 = int64(n1) + 20 22 n3 = int8(n1) + 20 23 ` 24 fmt.Println(question) 25 var n1 int32 = 12 26 var n2 int64 27 var n3 int8 28 29 n2 = int64(n1) + 20 30 n3 = int8(n1) + 20 31 fmt.Printf("n2 的类型为 %T,值= %v", n2, n2) 32 fmt.Println("") 33 fmt.Printf("n3 的类型为 %T,值= %v", n3, n3)
练习题2:
1 fmt.Println("练习题2") 2 question = ` 3 var n4 int32 = 12 4 var n5 int8 5 var n6 int8 6 7 n5 = n4 + 127 8 n6 = n4 + 128 9 问: 以上代码会编译通过吗? 10 ` 11 fmt.Println(question) 12 /* 13 .\typeTransition.go:83:7: cannot use n4 + 127 (value of type int32) as type int8 in assignment 14 .\typeTransition.go:84:7: cannot use n4 + 128 (value of type int32) as type int8 in assignment 15 */ 16 question = ` 17 var n4 int32 = 12 18 var n5 int8 19 var n6 int8 20 21 n5 = int8(n4) + 127 22 n6 = int8(n4) + 128 23 问: 以上代码会报错吗? 24 ` 25 fmt.Println(question) 26 // n5 = int8(n4) + 127 编译不会报错,但是n5的值会被截断 27 // n6 = int8(n4) + 128会编译报错:128 (untyped int constant) overflows int8 28 // 解读: 128超过了int8的取值范围 29 30 var n4 int32 = 12 31 var n5 int8 32 // var n6 int8 33 34 n5 = int8(n4) + 127 35 // n6 = int8(n4) + 128 36 fmt.Printf("n5 的类型为 %T,值= %v", n5, n5) // n5 的类型为 int8,值= -117 37 fmt.Println("") 38 i7 := 12 + 127 39 fmt.Println(int8(i7))// -117
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具