题一:
var n1 int32 = 12
var n2 int64
var n3 int8
n2 = n1+20
n3 = n1+20
fmt.Println("n2=",n2)//报错:cannot use n1+20(value of int32)as int64 value in assignment
fmt.Println("n3=",n3)//报错:cannot use n1+20(value of int32)as int8 value in assignment
以上报错是因为:
在go语言中一个类型不能接受其他类型的赋值
可以更正为
var n1 int32 = 12
var n2 int64
var n3 int8
n2 = int64(n1)+20
n3 = int8(n1)+20
fmt.Println("n2=",n2,"n3=",n3)//n2=32,n3=32
题二:
var n1 int32 = 12
var n3 int8
var n4 int8
n4 = int8(n1)+127 //编译通过,但是结果不是12+127,而是-117
n3 = int8(n1)+128 //编译不通过,因为128超出了n3的int8类型的值范围
fmt.Println(n3)
题三:
type MyInt1 int
type MyInt2 = int
func main() {
var i int =0
var i1 MyInt1 = i
var i2 MyInt2 = i
fmt.Println(i1,i2)
}
答案解析:
编译不通过,cannot use i (type int) as type MyInt1 in assignment
解析:这道题考的是类型别名与类型定义的区别。
type MyInt1 int
是基于类型 int 创建了新类型 MyInt1, type MyInt2 = int
是创建了 int 的类型别名 MyInt2,注意类型别名的定义时 = 。所以,var i1 MyInt1 = i
相当于是将 int 类型的变量赋值给 MyInt1 类型的变量,Go 是强类型语言,编译当然不通过;而 MyInt2 只是 int 的别名,本质上还是 int,可以赋值。
代码的赋值可以使用强制类型转化 var i1 MyInt1 = MyInt1(i)。