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

 

 

 

 

posted @ 2022-05-15 15:59  风铃如沧海  阅读(1213)  评论(0编辑  收藏  举报