面试题答案
一键面试- 动态类型和静态类型:
- 当将
structB
类型的实例赋值给interfaceA
类型变量时:- 静态类型:
interfaceA
。因为变量在声明时的类型是interfaceA
,这就是其静态类型。 - 动态类型:
structB
。由于实际存储在接口变量中的值是structB
类型的实例,所以structB
是动态类型。
- 静态类型:
- 当将
structC
类型的实例赋值给interfaceA
类型变量时:- 静态类型:同样是
interfaceA
。变量声明类型决定了静态类型。 - 动态类型:
structC
。因为实际存储的值是structC
类型的实例。
- 静态类型:同样是
- 当将
- 后续使用中的表现:
- 方法调用:
- 无论动态类型是
structB
还是structC
,都只能调用interfaceA
接口中定义的方法。因为编译器在编译时只知道变量的静态类型interfaceA
,所以只能确保接口中定义的方法可以被调用。例如,如果interfaceA
定义了Method1
方法,那么无论是interfaceA
变量持有structB
还是structC
实例,都可以通过该变量调用Method1
方法。 - 但是,如果
structB
或structC
有各自特有的方法(未在interfaceA
中定义),通过interfaceA
类型变量是无法直接调用这些特有方法的。比如structB
有SpecialMethodForB
方法,即使interfaceA
变量持有structB
实例,也不能直接用该变量调用SpecialMethodForB
方法。
- 无论动态类型是
- 类型断言:
- 可以使用类型断言来获取接口变量的动态类型。例如,对于持有
structB
实例的interfaceA
变量i
,可以通过b, ok := i.(structB)
来进行类型断言,若ok
为true
,则b
就是实际的structB
类型值,可以访问structB
特有的方法和字段。对于持有structC
实例的情况同理。 - 类型断言在运行时检查动态类型是否符合断言的类型,如果不符合,对于非空接口,类型断言会返回一个零值和
false
;对于空接口,会触发panic
。
- 可以使用类型断言来获取接口变量的动态类型。例如,对于持有
- 接口比较:
- 两个接口值比较时,如果它们的动态类型相同且动态值也相等(对于可比较类型,如基本类型、指针等,按照相应规则比较;对于自定义结构体,如果其所有字段可比较且对应字段相等,则结构体相等),则两个接口值相等。例如,如果两个
interfaceA
类型变量分别持有structB
实例,且这两个structB
实例的所有字段值都相等,那么这两个接口值相等。如果动态类型不同,即使它们实现了相同的接口,接口值也不相等。
- 两个接口值比较时,如果它们的动态类型相同且动态值也相等(对于可比较类型,如基本类型、指针等,按照相应规则比较;对于自定义结构体,如果其所有字段可比较且对应字段相等,则结构体相等),则两个接口值相等。例如,如果两个
- 方法调用: