Fork me on GitHub

Go之判断struct类型是否实现某接口

给出一段示例代码,主要演示如何判断某struct类型是否实现了某接口

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
31
32
package main

import (
"fmt"
"reflect"
)

type Tester interface {
Do() string
}

type User struct {
Name string
Age int
}

func (self User) Do() string {
return "do it"
}

func main() {
var u User

t := reflect.TypeOf(u)

//将nil转成Tester接口指针,然后再通过反射,Elem()方法获取指针对应的接口类型
fmt.Println(reflect.TypeOf((*Tester)(nil)).Elem().String())

if t.Implements(reflect.TypeOf((*Tester)(nil)).Elem()) {
fmt.Println("Support !!!")
}
}

输出:

1
2
main.Tester
Support !!!

本文中比较难理解的一个点就是需要将nil转换成接口指针类型 (接口也是go中的一个数据类型,和其他类型int,string一样,也是存在对应的指针类型的),然后通过反射获取该接口指针类型的类型,最后通过Element()方法获取指针对应的接口类型。之所以要这么做的原因是,无法直接获取接口的类型

尝试如下操作,获取Tester接口的类型:

1
2
var intf Tester  //nil接口
reflect.Typeof(intf)

也尝试过直接将nil转成Tester接口,然后通过反射获取类型

1
reflect.TypeOf(Tester(nil))

将上述结果作为参数传递给Implement(),都会报如下错误:

1
panic: reflect: nil type passed to Type.Implements

这是因为上述两种方法通过反射获取的类型都为nil

您的鼓励是我持之以恒的动力