Go 语言接口学习笔记
1. 接口介绍
在 Go 语言中,接口是实现多态性的一种方式。接口定义了一组方法签名,任何实现该接口的类型都必须实现这些方法。这使得我们可以通过接口变量来调用不同类型的对象,从而达到代码复用的目的。
2. 接口定义与实现
定义一个接口使用 type
和 interface
关键字:
goCopy Codetype MyInterface interface {
Method1() int
Method2(string) string
}
这里定义了一个名为 MyInterface
的接口,它包含两个方法签名。任何实现了 MyInterface
中定义的这两个方法的类型都可以被认为实现了 MyInterface
接口。
接口的实现需要满足以下条件:
- 类型必须实现接口中所有定义的方法。
- 类型不能额外拥有其他的方法。
下面是一个示例代码,展示如何实现一个 MyInterface
的实现:
goCopy Codetype MyStruct struct{}
func (s MyStruct) Method1() int {
return 1
}
func (s MyStruct) Method2(arg string) string {
return arg
}
这里定义了一个名为 MyStruct
的结构体,并实现了其中的两个方法,从而实现了 MyInterface
接口。注意,由于 MyStruct
实现了 MyInterface
,所以我们可以将它赋值给 MyInterface
类型的变量:
goCopy Codevar i MyInterface = MyStruct{}
3. 接口变量
在 Go 语言中,接口变量可以存储任何实现了该接口的值。这种特性使得我们可以使用任何实现了该接口的值来调用接口方法,从而达到多态的效果。
以下是一个示例代码,展示如何使用接口变量:
goCopy Codefunc callMethod(i MyInterface) {
fmt.Println(i.Method1())
fmt.Println(i.Method2("Hello"))
}
s := MyStruct{}
callMethod(s)
这里定义了一个名为 callMethod
的函数,它接受一个 MyInterface
类型的参数。当我们将 MyStruct
的实例传递给 callMethod
函数时,由于 MyStruct
实现了 MyInterface
,所以它可以被认为是 MyInterface
类型的变量,从而可以传递给 callMethod
函数。在 callMethod
函数中,我们可以通过接口变量来调用 MyStruct
中实现的方法。
4. 示例代码
下面是一个完整的示例代码,展示了如何使用接口实现多态的效果:
goCopy Codepackage main
import "fmt"
type MyInterface interface {
Method1() int
Method2(string) string
}
type MyStruct struct{}
func (s MyStruct) Method1() int {
return 1
}
func (s MyStruct) Method2(arg string) string {
return arg
}
func callMethod(i MyInterface) {
fmt.Println(i.Method1())
fmt.Println(i.Method2("Hello"))
}
func main() {
s := MyStruct{}
callMethod(s)
}
输出结果为:
Copy Code1 Hello