Reflection 查找对象支持的所有导入接口
我有一个类似于Reflection 查找对象支持的所有导入接口,reflection,go,Reflection,Go,我有一个类似于os.Stdout的对象,我想知道它在我的平台上是否支持io.WriteCloser。我可以得到对象的类型,但它没有告诉我任何关于接口的信息 package main import ("fmt"; "reflect"; "os") func main() { fmt.Println(reflect.TypeOf(os.Stdout)) } 此代码将*os.File打印到控制台 如果os.File与io.WriteCloser方法匹配,我可以手动查找,但我很想得到这个对
os.Stdout
的对象,我想知道它在我的平台上是否支持io.WriteCloser
。我可以得到对象的类型,但它没有告诉我任何关于接口的信息
package main
import ("fmt"; "reflect"; "os")
func main() {
fmt.Println(reflect.TypeOf(os.Stdout))
}
此代码将*os.File
打印到控制台
如果os.File
与io.WriteCloser
方法匹配,我可以手动查找,但我很想得到这个对象支持的所有接口。这不是这个问题的确切答案,因为它不适用于运行时。不管怎样,我认为这可能有用
看看godoc
具有静态分析功能。它可以显示您的类型和关系
例如,您可以运行
godoc-http=:8081-analysis=type
并使用类型分析获取所有软件包文档。要展开@Volker关于类型断言的评论,如下所示:
_, implements := interface{}(os.Stdout).(io.Reader)
它将os.Stdout
强制转换为接口{}
类型,然后尝试断言它是io.Reader
。类型断言返回两个值;第一个是断言值(如果断言失败,则为nil),第二个是布尔值,指示断言是否成功。如果忽略捕获第二个返回值,则失败的断言将导致恐慌
作为替代方案,可能是更通用的或运行时需求,类型包可能有一些基于反射的有用函数:我很感激你的指针,但这并不能回答问题。哦,对不起,我刚刚错过了你谈论的运行时。嗯,我是新手,所以我习惯直接在代码中插入内容来检查它。但是如果有一个命令行给我这个信息,我想这也有资格。当然,在Python之类的东西中,动态获取这些信息为具有模块化/插件结构(如Twisted、Trac等)的高级东西提供了一些灵活性。无论如何,尝试使用
godoc-http=:8081-analysis=type
。然后在localhost:8081上,您可以使用类型分析来导出所有包。Go使用duck类型,所以在运行时可能会很困难,但我不确定=)至少这是一个问题。谢谢运行时的“所有接口”实际上是不可能的。通过“类型断言”检查一个已知类型。@Volker这听起来像是一个有效的答案。