MST
星途 面试题库

面试题:Go类型相同性判断的复杂边界场景

假设有如下代码:type Base struct { Field int } type Derived1 struct { Base } type Derived2 struct { Base }。同时定义两个接口:type Interface1 interface { Method1() } type Interface2 interface { Method1() }。现在,给 Derived1 和 Derived2 分别实现 Interface1 和 Interface2 的 Method1 方法。请判断 Derived1 和 Derived2 类型是否相同,Interface1 和 Interface2 类型是否相同,并阐述Go语言在这种情况下判断类型相同性的依据及相关规则。
33.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. Derived1 和 Derived2 类型不相同
    • 在Go语言中,即使两个结构体嵌套了相同的匿名结构体类型(这里Derived1和Derived2都嵌套了Base结构体),它们依然是不同的类型。这是因为Go语言中结构体类型的定义是基于其内部结构和字段顺序的。每个结构体类型的定义在Go语言中都被视为一个新的、独特的类型,除非它们被显式定义为别名。所以,尽管Derived1和Derived2有相似的结构,但它们是不同的类型。
  2. Interface1 和 Interface2 类型不相同
    • 在Go语言中,接口类型是由其方法集合唯一确定的。虽然Interface1和Interface2都只有一个Method1方法,但它们是不同的接口类型定义。即使两个接口有相同的方法集合,只要它们是不同的接口定义,它们就是不同的接口类型。这是Go语言的类型系统设计原则,接口类型的定义标识了其唯一性,而非仅仅依赖方法集合。
  3. Go语言判断类型相同性依据及规则
    • 结构体类型:结构体类型由其内部字段的顺序和类型决定。即使结构体字段相同,但如果定义不同,它们就是不同的类型。不同包中定义的相同结构的结构体也是不同类型。只有使用类型别名(type Alias = OriginalType)定义的结构体与原结构体类型相同。
    • 接口类型:接口类型由其方法集合和接口定义本身决定。即使两个接口有相同的方法集合,如果它们是不同的接口定义,就是不同的接口类型。接口类型的唯一性基于其定义,而不仅仅是方法集合。只有使用类型别名定义的接口与原接口类型相同。