面试题答案
一键面试a
赋值为42
时b
的类型:b
的类型是int
。- 原因:在Go语言中,虽然
a
被声明为interface{}
类型并赋值为42
(42
是int
类型的字面常量),当将a
赋值给b
时,由于此时a
的动态类型是int
,Go语言会进行类型断言并将b
推导为int
类型。interface{}
类型的变量在赋值时会存储值和其动态类型,当进行赋值操作var b = a
时,会根据a
当前存储的动态类型来推导b
的类型。
a
赋值为3.14
时b
的类型:b
的类型是float64
。- 原因:
3.14
是float64
类型的字面常量,当a
被赋值为3.14
时,a
的动态类型变为float64
。同样,在执行var b = a
时,Go语言会根据a
当前存储的动态类型(float64
)来推导b
的类型,所以b
被推导为float64
类型。
- Go语言在这种涉及接口的情况下字面常量类型推导的过程:
- 当一个字面常量赋值给
interface{}
类型的变量时,Go语言会记住该字面常量的具体类型(例如int
、float64
等)作为该接口变量的动态类型。 - 当从这个
interface{}
类型变量赋值给另一个变量时,Go语言会根据接口变量当前存储的动态类型来推导目标变量的类型。如果接口变量存储了多个值(例如通过类型断言返回多个值的情况),会根据具体规则进行处理,但在简单的赋值var b = a
这种情况下,就是根据a
的动态类型推导b
的类型。
- 当一个字面常量赋值给