Wątek przeniesiony 2021-09-16 09:47 z Inne języki programowania przez cerrato.

Jak znaleźć typy, które implementują interfes w Golangu

0

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 :)

0

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.

2

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1