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