学习Go几个月后,我发现os.File
通过实现io.Reader
函数来实现Read(b []byte) (n int, err error)
接口。这允许我使用缓冲的阅读器来读取文件,例如:
std::isinf(x) || std::isnan(x)
除非我错过,否则看起来并没有"所有已知的实施课程"在Go接口上的文档中,就像在Java接口文档中找到的那样。
有没有办法在Go中识别实现接口的类型?
答案 0 :(得分:10)
使用godoc命令的静态分析工具,您可以找到所需的信息。在命令行运行以下命令:godoc -http=":8080" -analysis="type"
。使用该文档,您可以找出实现接口的类型和类型的方法集。
还有一个指针分析,允许您查找各种类型的呼叫者和被叫者。频道发送< --->接收分析非常简洁。
阅读有关godoc工具完成的静态分析的更多信息答案 1 :(得分:3)
https://github.com/dominikh/implements可以做到这一点:
implements是一个命令行工具,它将告诉您哪些类型实现哪些接口,或哪些接口由哪些类型实现。
e.g。
~ implements -types=crypto/cipher
crypto/cipher.StreamReader implements...
io.Reader
*crypto/cipher.StreamReader implements...
io.Reader
crypto/cipher.StreamWriter implements...
io.Closer
io.WriteCloser
io.Writer
*crypto/cipher.StreamWriter implements...
io.Closer
io.WriteCloser
io.Writer
答案 2 :(得分:1)
对于所有vim瘾君子,vim-go支持使用:GoImplements
,:GoCallees
,:GoChannelPeers
,:GoReferrers
等oracle命令进行高级代码分析。
例如,如果我有一个Calculator
接口和实现,如下所示:
type Arithmetic interface{
add(float64, float64) float64
}
type Calculator struct{}
func (c *calculator) add(o1, o2 float64) float64 {
// ... stuff
}
然后在:GoImplements
上用光标在vim中运行type Arithmetic interface
会产生类似的结果:
calculator.go|8 col 6| interface type Arithmetic
calculator.go|3 col 6| is implemented by pointer type *calculator
现在,如果我将光标移到type Calculator struct{}
行并运行:GoImplements
,我会得到类似的内容:
calculator.go|3 col 6| pointer type *calculator
calculator.go|8 col 6| implements Arithmetic
注意:如果您遇到“未知命令”错误,请在重新尝试之前先尝试执行:GoInstallBinaries
。