Документация по "всем известным реализациям" интерфейсов

Несколько месяцев обучения. Я просто обнаружил, что os.File реализует интерфейс io.Reader реализуя функцию Read(b []byte) (n int, err error). Это позволяет мне использовать буферный считыватель для чтения файла, например:

f, err := os.Open("myfile.txt")
bufReader := bufio.NewReader(f)

Если я пропустил это, похоже, что в документах Go на интерфейсах нет "Все известные классы реализации", как и в документации по интерфейсам Java.

Есть ли способ идентифицировать типы, реализующие интерфейс в Go?

Ответ 1

Вы можете найти информацию, которую хотите, и многое другое, используя инструменты статического анализа godoc. Выполните следующую команду в командной строке: godoc -http=":8080" -analysis="type". Используя документацию, вы можете узнать, какие типы реализуют интерфейс и метод, заданный для типа.

Существует также анализ указателей, который позволяет находить абонентов и вызываемых абонентов различных типов. Анализ передачи канала < --- > получается довольно аккуратным.

Вы также можете узнать больше о статическом анализе, сделанном инструментом godoc, в http://golang.org/lib/godoc/analysis/help.html

Ответ 2

https://github.com/dominikh/implements может сделать это:

tools - это инструмент командной строки, который расскажет вам, какие типы реализуют какие интерфейсы или какие интерфейсы реализуются с помощью каких типов.

например.

~ 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

Ответ 3

Для всех вас, vim junkies, vim-go поддерживает предварительный анализ кода с помощью :GoImplements, :GoCallees, :GoChannelPeers, :GoReferrers и т.д. команды оракула. ​​

Например, если у меня есть интерфейс 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 перед повторной попыткой.