关于"所有已知实施的文档"接口

时间:2015-08-01 06:53:32

标签: go

学习Go几个月后,我发现os.File通过实现io.Reader函数来实现Read(b []byte) (n int, err error)接口。这允许我使用缓冲的阅读器来读取文件,例如:

std::isinf(x) || std::isnan(x)

除非我错过,否则看起来并没有"所有已知的实施课程"在Go接口上的文档中,就像在Java接口文档中找到的那样。

有没有办法在Go中识别实现接口的类型?

3 个答案:

答案 0 :(得分:10)

使用godoc命令的静态分析工具,您可以找到所需的信息。在命令行运行以下命令:godoc -http=":8080" -analysis="type"。使用该文档,您可以找出实现接口的类型和类型的方法集。

还有一个指针分析,允许您查找各种类型的呼叫者和被叫者。频道发送< --->接收分析非常简洁。

您还可以在http://golang.org/lib/godoc/analysis/help.html

阅读有关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