go判断类型是否实现接口所有方法

https://geektutu.com/post/quick-golang.html

一般而言,接口定义了一组方法的集合,接口不能被实例化,一个类型可以实现多个接口。

举一个简单的例子,定义一个接口 Person和对应的方法 getName() 和 getAge()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type Person interface {
getName() string
}

type Student struct {
name string
age int
}

func (stu *Student) getName() string {
return stu.name
}

type Worker struct {
name string
gender string
}

func (w *Worker) getName() string {
return w.name
}

func main() {
var p Person = &Student{
name: "Tom",
age: 18,
}

fmt.Println(p.getName()) // Tom
}
  • Go 语言中,并不需要显式地声明实现了哪一个接口,只需要直接实现该接口对应的方法即可。
  • 实例化 Student后,强制类型转换为接口类型 Person。

在上面的例子中,我们在 main 函数中尝试将 Student 实例类型转换为 Person,如果 Student 没有完全实现 Person 的方法,比如我们将 (*Student).getName() 删掉,编译时会出现如下报错信息。

1
*Student does not implement Person (missing getName method)

但是删除 (*Worker).getName() 程序并不会报错,因为我们并没有在 main 函数中使用。这种情况下我们如何确保某个类型实现了某个接口的所有方法呢?一般可以使用下面的方法进行检测,如果实现不完整,编译期将会报错。

1
2
var _ Person = (*Student)(nil)
var _ Person = (*Worker)(nil)
posted @ 2021-10-24 11:50  技术颜良  阅读(939)  评论(0编辑  收藏  举报