Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 查找对象支持的所有导入接口_Reflection_Go - Fatal编程技术网

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这听起来像是一个有效的答案。