查找对象支持的所有导入的接口

时间:2015-11-19 09:22:57

标签: 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方法,但我很想获得此对象支持的所有接口。

2 个答案:

答案 0 :(得分:1)

这不是问题的确切答案,因为它不适用于运行时。无论如何,我认为它可能有用

看看https://golang.org/lib/godoc/analysis/help.html
godoc具有静态分析功能。它可以显示你的类型实现关系。

例如,您可以运行godoc -http=:8081 -analysis=type并获取包含类型分析的所有包文档。

答案 1 :(得分:1)

要扩展@Volker关于类型断言的注释,它将如下所示:

_, implements := interface{}(os.Stdout).(io.Reader)

它将os.Stdout强制转换为interface{}类型,然后尝试断言它是io.Reader。类型断言返回两个值;第一个是断言值(如果断言失败则为nil),第二个是布尔值,表示断言是否成功。如果省略捕获第二个返回值,那么失败的断言将导致恐慌。

对于替代的,可能更通用或运行时的要求,类型包可能具有一些基于反射的有用功能:https://godoc.org/golang.org/x/tools/go/types