Go中无法静态获取类型是否实现接口,但可通过reflect.Type.Implements在运行时判断类型是否满足接口契约,需传入接口的reflect.Type,且仅适用于具体类型而非接口本身。
在 Go 中,接口是隐式实现的,没有类似 Java 的 implements 关键字声明。因此,**不能直接通过反射获取一个类型“是否实现了某个接口”的静态信息*
*,但可以通过反射配合类型断言或 reflect.Type.Implements 方法,在运行时判断某个值(或其底层类型)是否满足某接口要求。
这是最常用、最推荐的方式:它检查的是 类型的定义是否满足接口契约(即方法集是否包含接口所有方法),不依赖具体值,适用于已知类型(如 *MyStruct、MyStruct)。
reflect.Type,可通过 reflect.TypeOf((*YourInterface)(nil)).Elem() 获取reflect.Type(不能是 reflect.Value)示例:
func implementsInterface(v interface{}, iface interface{}) bool {当只有某个 interface{} 值(比如函数参数),且你想知道它底层的具体类型是否实现了某接口时,可先用反射取出类型,再用 Implements;或者更直接地——用类型断言尝试转换,这更符合 Go 的惯用法。
if _, ok := v.(YourInterface); ok { ... }
reflect.Value.Interface() 可能 panic,需确保值可导出且非零值func (*T) Method()),则只有 *T 类型实现该接口,T 不实现 —— Implements 会如实反映这一点reflect.TypeOf(v) 提取其底层具体类型;如果 v 是 nil 接口,reflect.TypeOf(v) 返回 nilImplements 是作用于具体类型(如 struct、ptr)的方法,不是接口的方法func Do[T YourInterface](t T)
注意最后一点:要检测自定义接口,必须用该接口的 reflect.Type,不能混用标准库同名接口(即使方法签名一致)。