我有一个像os.Stdout
这样的对象,我想知道它是否支持我平台上的io.WriteCloser
。我可以得到我的对象的类型,但它没有告诉我有关接口的任何信息。
package main
import ("fmt"; "reflect"; "os")
func main() {
fmt.Println(reflect.TypeOf(os.Stdout))
}
此代码将*os.File
打印到控制台。
我可以手动查找os.File
是否匹配io.WriteCloser
方法,但我很想获得此对象支持的所有接口。
答案 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