Ich war überrascht, dass Go eine "goto" -Aussage hat. Mir wurde immer beigebracht, dass 'goto'-Aussagen der Vergangenheit angehören und böse sind, da sie den tatsächlichen Ablauf eines Programms verschließen und dass Funktionen oder Methoden immer eine bessere Möglichkeit sind, den Ablauf zu steuern.
Mir muss etwas fehlen. Warum hat Google es aufgenommen?
goto
dies in bestimmten Fällen nützlich ist. Lesen Sie nach dem Studium von @ Kissakis Antwort.Antworten:
Wenn wir den Quellcode der Go-Standardbibliothek überprüfen, können wir sehen, wo
goto
s tatsächlich gut angewendet wird.In der
math/gamma.go
Datei wird beispielsweise die folgendegoto
Anweisung verwendet :Die
goto
in diesem Fall erspart uns die Einführung ein anderes (boolean) Variable nur für Steuerstrom verwendet wird , am Ende geprüft. In diesem Fallgoto
macht die Anweisung den Code tatsächlich besser lesbar und leichter zu befolgen (ganz im Gegensatz zu dem vongoto
Ihnen erwähnten Argument gegen Sie).Beachten Sie auch, dass die
goto
Anweisung einen sehr spezifischen Anwendungsfall hat. Die Sprachspezifikation auf goto besagt, dass möglicherweise nicht über Variablen gesprungen wird, die in den Gültigkeitsbereich fallen (deklariert werden), und dass sie möglicherweise nicht in andere (Code-) Blöcke springen.quelle
small(x,z)
, die stattdessen aufgerufen werden soll? Auf diese Weise müssen wir nicht darüber nachdenken, auf welche Variablen imsmall:
Label zugegriffen werden kann. Ich vermute, der Grund dafür ist, dass go immer noch bestimmte Arten von Inlining-Unterstützung im Compiler fehlt.goto
, auf ein Label zu zeigen, nachdem neue Variablen eingeführt wurden. Das Ausführen der "goto" -Anweisung darf nicht dazu führen, dass Variablen in den Gültigkeitsbereich gelangen, die zum Zeitpunkt des goto-Vorgangs noch nicht im Gültigkeitsbereich waren.Springen ist eine gute Idee, wenn keine der integrierten Steuerungsfunktionen genau das tut, was Sie wollen, und wenn Sie mit einem goto ausdrücken können, was Sie wollen. (In diesen Fällen ist es in einigen Sprachen eine Schande, wenn Sie kein goto haben. Am Ende missbrauchen Sie eine Kontrollfunktion, verwenden boolesche Flags oder verwenden andere Lösungen, die schlechter sind als goto.)
Wenn eine andere Steuerungsfunktion (die auf ziemlich offensichtliche Weise verwendet wird) das tun kann, was Sie wollen, sollten Sie sie vorziehen, um zu gehen. Wenn nicht, sei mutig und benutze goto!
Schließlich ist es erwähnenswert, dass Go's goto einige Einschränkungen hat, um einige obskure Fehler zu vermeiden. Siehe diese Einschränkungen in der Spezifikation.
quelle
Die Aussagen von Goto wurden seit der Ära des Spaghetti-Codes in den 60er und 70er Jahren stark diskreditiert . Damals gab es eine sehr schlechte bis gar keine Softwareentwicklungsmethode. Goto sind jedoch nicht von Natur aus böse, sondern können natürlich von faulen oder ungelernten Programmierern missbraucht und missbraucht werden. Viele Probleme mit missbrauchten Gotos können mit Entwicklungsprozessen wie Teamcode-Überprüfungen gelöst werden.
goto
sind Sprünge in der gleichen technischen Weise wiecontinue
,break
undreturn
. Man könnte argumentieren, dass dies Aussagen sind, die auf die gleiche Weise böse sind, aber sie sind es nicht.Warum das Go-Team Gotos aufgenommen hat, liegt wahrscheinlich daran, dass es sich um ein allgemeines Grundelement für die Flusskontrolle handelt. Außerdem kamen sie hoffentlich zu dem Schluss, dass der Geltungsbereich von Go ausschließt, dass eine idiotensichere Sprache nicht missbraucht werden kann.
quelle
continue
,,break
undreturn
unterscheiden sich in einem Schlüssel sehr stark: Sie geben nur "den einschließenden Bereich verlassen" an. Sie ermutigen den Entwickler nicht nur, sondern verlangen ausdrücklich, dass er die Struktur seines Codes berücksichtigt und sich auf strukturierte Programmierprimitive (für Schleifen, Funktionen und switch-Anweisungen) verlässt. Die einzige Rettung vongoto
Anweisungen besteht darin, dass Sie Assembler in eine HLL schreiben können, wenn der Optimierer des Compilers der Aufgabe nicht gewachsen ist. Dies geht jedoch zu Lasten der Lesbarkeit und Wartbarkeit.setjmp
,longjmp
,goto
, undtry / except / finally
sie zu err auf der Seite gewählt Vorsicht.goto
fwict ist die einzige Zustimmung zum Kontrollfluss vor der "strukturierten Programmierung".