Go 语言接口学习笔记

1. 接口介绍

在 Go 语言中,接口是实现多态性的一种方式。接口定义了一组方法签名,任何实现该接口的类型都必须实现这些方法。这使得我们可以通过接口变量来调用不同类型的对象,从而达到代码复用的目的。

2. 接口定义与实现

定义一个接口使用 typeinterface 关键字:

goCopy Code
type MyInterface interface { Method1() int Method2(string) string }

这里定义了一个名为 MyInterface 的接口,它包含两个方法签名。任何实现了 MyInterface 中定义的这两个方法的类型都可以被认为实现了 MyInterface 接口。

接口的实现需要满足以下条件:

  1. 类型必须实现接口中所有定义的方法。
  2. 类型不能额外拥有其他的方法。

下面是一个示例代码,展示如何实现一个 MyInterface 的实现:

goCopy Code
type MyStruct struct{} func (s MyStruct) Method1() int { return 1 } func (s MyStruct) Method2(arg string) string { return arg }

这里定义了一个名为 MyStruct 的结构体,并实现了其中的两个方法,从而实现了 MyInterface 接口。注意,由于 MyStruct 实现了 MyInterface,所以我们可以将它赋值给 MyInterface 类型的变量:

goCopy Code
var i MyInterface = MyStruct{}

3. 接口变量

在 Go 语言中,接口变量可以存储任何实现了该接口的值。这种特性使得我们可以使用任何实现了该接口的值来调用接口方法,从而达到多态的效果。

以下是一个示例代码,展示如何使用接口变量:

goCopy Code
func 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 Code
package 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 Code
1 Hello