✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
7. Go 两个接口之间可以存在什么关系?
在 Go 语言中,接口是一种类型,可以被用作变量类型、函数参数或返回值的类型。Go 语言中的接口类型是基于所包含的方法签名来定义的,两个接口之间可以存在以下几种关系:
- 接口类型的嵌套:一个接口类型可以包含其他的接口类型作为它的一部分,这种方式称为接口的嵌套。嵌套接口会继承被嵌套接口的所有方法,并可以添加新的方法。嵌套接口的实现类必须实现所有嵌套接口的方法。
- 接口类型的扩展:一个接口类型可以通过添加新的方法来扩展另一个接口类型,这种方式称为接口的扩展。被扩展接口的实现类也必须实现新添加的方法。
- 接口类型的类型转换:可以将一个接口类型转换为另一个接口类型,前提是这两个接口类型都包含相同的方法集合。
- 接口类型的实现:一个接口类型可以被多个不同的类型实现,这些类型可以是基本类型、自定义类型或者其他接口类型。
需要注意的是,两个接口之间的关系并不是继承关系,而是通过包含相同的方法集合来建立联系。这意味着,一个接口类型并不会继承另一个接口类型的属性和方法。
8. 嵌套和扩展的区别
扩展和嵌套是不同的概念。
接口类型的嵌套是将一个接口类型作为另一个接口类型的一部分,嵌套的接口类型可以继承被嵌套接口类型的所有方法,并可以添加新的方法。
接口类型的扩展是在一个接口类型的基础上新增方法,被扩展的接口类型的实现类也必须实现新添加的方法。
嵌套和扩展的区别在于,嵌套是将接口类型作为另一个接口类型的一部分,而扩展是在接口类型的基础上新增方法。嵌套是一种组合关系,扩展是一种继承关系。
9. 实例演示
1、接口类型的嵌套:假设有两个接口类型 A 和 B,其中 B 嵌套了 A。A 定义了一个方法 DoSomething(),B 新增了一个方法 DoSomethingElse()。那么实现 B 接口的类必须实现 A 接口中的 DoSomething() 方法和 B 接口中的 DoSomethingElse() 方法。
type A interface {DoSomething()
}type B interface {A // A是B的一部分DoSomethingElse()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func (mc *MyClass) DoSomethingElse() {fmt.Println("Do something else.")
}func main() {var b B = &MyClass{}b.DoSomething()b.DoSomethingElse()
}
2、接口类型的扩展:假设有两个接口类型 A 和 B,其中 A 定义了一个方法 DoSomething(),B 通过扩展 A 接口新增了一个方法 DoSomethingElse()。那么实现 B 接口的类必须实现 A 和 B 接口中的所有方法。
type A interface {DoSomething()
}type B interface {A // 扩展A接口DoSomethingElse()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func (mc *MyClass) DoSomethingElse() {fmt.Println("Do something else.")
}func main() {var b B = &MyClass{}b.DoSomething()b.DoSomethingElse()
}
3、接口类型的类型转换:假设有两个接口类型 A 和 B,其中 A 和 B 都定义了方法 DoSomething()。那么可以将 A 类型的变量转换为 BB类型的变量,前提是 A 和 B 包含相同的方法集合。
type A interface {DoSomething()
}type B interface {DoSomething()
}type MyClass struct {}func (mc *MyClass) DoSomething() {fmt.Println("Do something.")
}func main() {var a A = &MyClass{}var b B = a.(B) // 类型转换b.DoSomething()
}
4、接口类型的实现:假设有一个接口类型 A,它定义了一个方法 DoSomething()。那么可以有多个类型实现 A 接口,只要这些类型实现了 A 接口中定义的所有方法。
type A interface {DoSomething()
}type MyClass1 struct {}func (mc *MyClass1) DoSomething() {fmt.Println("Do something in MyClass1.")
}type MyClass2 struct {}func (mc *MyClass2) DoSomething() {fmt.Println("Do something in MyClass2.")
}func main() {var a A = &MyClass1{}a.DoSomething()a = &MyClass2{}a.DoSomething()
}