Czy mógłby mi ktoś wyjaśnić w jaki sposób mogę znaleźć odpowiednie typy, które implementują dany interfejs?
Mam np funkcję http.FileServer(root http.FileSystem) http.Handler
gdzie http.FileSystem
jest interfejsem. Jak mogę szybko znaleźć typy, które ten interfejs implementują i które mógłbym przekazać w parametrze funkcji? Przecież nie sposób zapamiętać wszystkich typów w bibliotekach i co one implementują. A przeglądanie za każdym dokumentacji, gdy chcę wywołać jakąś funkcję, jest nudne i czasochłonne. Znalazłem takie narzędzie jak guru
(https://docs.google.com/document/d/1_Y9xCEMj5S-7rv2ooHpZNH15JgRT5iM742gJkw5LtmQ/edit#) gdzie jest opcja implements
aczkolwiek ona mi sprawdza dany typ i jakie implementuje interfejsy. Czyli odwrotnie. Ja chciałbym na podstawie deklaracji interfesu znaleźć typy, które ten interfejs implementują i które mogę wykorzystać i przekazać do funkcji.
Mam nadzieję, że moje wypociny są jasne :)
- https://stackoverflow.com/questions/30012910/how-do-you-quickly-find-the-implementations-of-an-interface-in-golang
-
GoLand również posiada taką możliwość (
Go to implementations
: https://stackoverflow.com/questions/38826591/intellij-idea-jump-from-interface-to-implementing-method-in-go).
Tzn ja zrobiłem research na stackoverflow przed zadaniem tego pytania, ale może coś przegapiłem.
Mianowicie, z pierwszego linku go oracle implements
, dominikh/implements
, fzipp/pythia
są przestarzałe i w dokumentacji bezpośrednio wskazują aby korzystać z guru
Z tego samego wątku go types Implements() function
- nigdzie nie widzę tej funkcji, poza tym jak miałbym z tego skorzystać
Link do wątku zduplikowanego (https://stackoverflow.com/questions/14577162/how-to-find-out-which-types-implement-which-interface-in-golang) pokazuje dwa sposoby. Pierwszy poprzez grep
np. egrep -nr '^func (.*) ReadByte\(' *
Jest to rozwiązanie siermiężne. Drugi sposób odwołuje się znowu do go oracle
, które jak wczesniej zostało zastąpione przez guru
.
Natomiast nie wiem jak mógłbym za pomocą guru
uzyskać to co chcę.
Co do GoLanda, narzędzie komercyjne, płatne. Na razie uczę się i korzystam z VSCode.
Sprawdziłem ten case, bo samego mnie to zainteresowało. Możesz do tego użyć guru
właśnie, jak nie chcesz bawić się GoLand (w nim wygodniej) spróbuj w vim-go
. Podaję instrukcję dla vim-go właśnie
Najpierw daj :GoInstallBinaries
jak już odpalisz vima, dla pewności. Zakładam, że guru
już masz.
I teraz możesz to zrobić w taki sposób - podaję przykład dla io.Reader
u mnie 1.12.9 jest w $GOROOT/src/io/io.go:77
- otwieram ten plik za pomocą vim-go
i przechodze do tej linii właśnie.
Czyli chcę sprawdzić w moim $GOPATH, gdzie mam pełno paczek od powiedzmy hashicorp w github.com/hashicorp/...
, które typy z tego katalogu implementują interfejs io.Reader
, który mam teraz otwarty w edytorze, więc ustawiam scope:
:GoGuruScope github.com/hashicorp/...
Powinno wyskoczyć, że success czy coś takiego. I następnie ustawiam kursor na pierwszą (wielką) literę nazwy Reader (to jest offset, który guru
potrzebuje, vim-go przekaże) i wklepuję:
:GoImplements
I wskaże mi, które typy w wybranym scopie, w tym przypadku w github.com/hashicorp/...
, implementują typ Reader