Zaskoczyło mnie, że Go zawiera stwierdzenie „goto” . Zawsze uczono mnie, że instrukcje „goto” należą do przeszłości i są złe, ponieważ blokują rzeczywisty przepływ programu, a funkcje lub metody są zawsze lepszym sposobem kontrolowania przepływu.
Muszę czegoś przegapić. Dlaczego Google to umieściło?
goto
jest przydatna w niektórych przypadkach. Przeczytaj po przestudiowaniu odpowiedzi @ Kissaki.Odpowiedzi:
Kiedy faktycznie sprawdzimy kod źródłowy standardowej biblioteki Go, możemy zobaczyć, gdzie
goto
są one właściwie dobrze zastosowane.Na przykład w
math/gamma.go
pliku oświadczenie jest używany :goto
W
goto
tym przypadku chroni nas przed wprowadzeniem kolejnej (boolowskiej) zmiennej używanej tylko do sterowania przepływem, sprawdzanej na końcu. W tym przypadku ,goto
oświadczenie czyni kod właściwie lepsze i łatwiejsze do odczytania obserwacji (dość w przeciwieństwie do argumentu przeciwkogoto
wspomniałeś).Należy również zauważyć, że
goto
instrukcja ma bardzo specyficzny przypadek użycia. Specyfikacja języka w goto stwierdza, że nie może przeskakiwać zmiennych wchodzących w zakres (deklarowanych) i nie może przeskakiwać do innych bloków (kodu).źródło
small(x,z)
do wywołania? W ten sposób nie musimy myśleć o tym, jakie zmienne są dostępne wsmall:
etykiecie. Podejrzewam, że powód go nadal nie obsługuje pewnych typów wbudowanej obsługi w kompilatorze.goto
na wskazanie etykiety po wprowadzeniu nowych zmiennych. Wykonanie instrukcji „goto” nie może powodować wejścia w zakres żadnych zmiennych, które nie znajdowały się jeszcze w zakresie w momencie wykonania goto.Goto to dobry pomysł, gdy żadna z wbudowanych funkcji kontrolnych nie robi tego, co chcesz, i kiedy możesz wyrazić to, co chcesz, za pomocą goto. (Szkoda w tych przypadkach w niektórych językach, gdy nie masz goto. W końcu nadużywasz jakiejś funkcji kontrolnej, używasz flag logicznych lub używasz innych rozwiązań gorszych niż goto.)
Jeśli jakaś inna funkcja kontrolna (używana w dość oczywisty sposób) może zrobić to, co chcesz, powinieneś użyć jej zamiast goto. Jeśli nie, bądź odważny i użyj goto!
Na koniec warto zauważyć, że Go's goto ma pewne ograniczenia zaprojektowane w celu uniknięcia niektórych niejasnych błędów. Zobacz te ograniczenia w specyfikacji.
źródło
Wypowiedzi Goto spotykały się z dużym uznaniem od czasów kodu Spaghetti w latach 60. i 70. W tamtych czasach metodologia tworzenia oprogramowania była bardzo słaba lub żadna. Jednak Goto nie są natywnie złe, ale oczywiście mogą być nadużywane i nadużywane przez leniwych lub niewykwalifikowanych programistów. Wiele problemów z nadużywanymi Gotos można rozwiązać za pomocą procesów programistycznych, takich jak przeglądy kodu zespołu.
goto
są skokami w taki sam sposób techniczny jakcontinue
,break
ireturn
. Można by argumentować, że te stwierdzenia są złe w ten sam sposób, ale tak nie jest.Dlaczego zespół Go włączył Gotos, prawdopodobnie wynika z faktu, że jest to powszechny prymityw kontroli przepływu. Ponadto, miejmy nadzieję, doszli do wniosku, że zakres Go wyklucza uniemożliwienie nadużywania języka bezpiecznego dla idioty.
źródło
continue
,break
ireturn
są bardzo różne w jednym szczególnym kluczu: określają tylko „zostaw otaczający zakres”. Nie tylko zachęcają, ale wyraźnie wymagają, aby deweloper rozważał strukturę swojego kodu i polegał na strukturalnych prymitywach programowania (w przypadku pętli, funkcji i instrukcji switch). Jedyną zaletągoto
instrukcji jest to, że pozwalają one na pisanie asemblacji w HLL, gdy optymalizator kompilatora nie jest w stanie sprostać zadaniu, ale odbywa się to kosztem czytelności i łatwości utrzymania.setjmp
,longjmp
,goto
, itry / except / finally
wybrali zaważyć na ostrożności.goto
, fwict, jest jedynym przyzwoleniem na przepływ sterowania z góry „programowania strukturalnego”.