2015-11-19 67 views
0

我有一个对象,如os.Stdout,我想知道它是否支持我的平台上的io.WriteCloser。我可以得到我的对象的类型,但它并没有告诉我有关接口的任何信息。查找对象支持的所有导入接口

package main 

import ("fmt"; "reflect"; "os") 

func main() { 
    fmt.Println(reflect.TypeOf(os.Stdout)) 
} 

该代码将*os.File打印到控制台。

我可以手动查找,如果os.File匹配io.WriteCloser方法,但我很好奇得到此对象支持的所有接口。

+3

“的所有接口”在运行时实际上是不可能的。检查一个已知的一个是通过“类型断言”完成的。 – Volker

+0

@Volker这听起来像是一个有效的答案。 –

回答

1

这不是问题的完全答案,因为它不适用于运行时。无论如何,我认为它也许有用

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

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

+0

我很欣赏你的指针,但是这并没有回答这个问题。 –

+0

对不起,我错过了你正在谈论的运行时间 – RoninDev

+0

嗯,我是Go的新手,所以我曾经直接在代码中插入东西来检查它。但是如果有一条命令行向我提供这些信息 - 我想这也可以符合条件。但是当然像Python这样的动态获取这些信息动态地提供了一些模块化/插件结构像Twisted,Trac等高级事物的灵活性。 –

1

为了扩大从@Volker关于类型断言评论,这应该是这样的:

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

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

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

+0

谢谢。这绝对是一个有用的信息。 –