Документация по "всем известным реализациям" интерфейсов
Несколько месяцев обучения. Я просто обнаружил, что 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
перед повторной попыткой.