Warum erlaubt Go die Kompilierung nicht verwendeter Funktionsparameter?

8

Einer der bemerkenswertesten Aspekte von Go, wenn Sie von C kommen, ist, dass der Compiler Ihr Programm nicht erstellt, wenn in ihm eine nicht verwendete Variable deklariert ist. Warum also wird dieses Programm aufgebaut, wenn in einer Funktion ein unbenutzter Parameter deklariert ist?

%Vor%     
Miles 21.03.2014, 02:48
quelle

2 Antworten

20

Es gibt keinen offiziellen Grund, aber der Grund, der auf Golang-Nüssen gegeben wird, ist:

  

Unbenutzte Variablen sind immer ein Programmierfehler, obwohl es üblich ist   um eine Funktion zu schreiben, die nicht alle Argumente verwendet.

     

Man könnte diese Argumente unbenannt lassen (mit _), aber dann könnte das passieren   Verwechsle mit Funktionen wie

     

func foo (_ string, _ int) // was soll das tun?

     

Die Namen, selbst wenn sie nicht verwendet werden, liefern wichtige Dokumente.

     

Andrew

Ссылка

Manchmal ist es wichtig, ungenutzte Parameter zu haben, um Schnittstellen zu erfüllen. Ein Beispiel könnte eine Funktion sein, die auf einem gewichteten Graphen arbeitet. Wenn Sie ein Diagramm mit einheitlichen Kosten über alle Kanten hinweg implementieren möchten, ist es sinnlos, die Knoten zu betrachten:

%Vor%

Wie in diesen Thread-Hinweisen gibt es ein gültiges Argument, nur Parameter mit dem Namen _ zuzulassen, wenn sie nicht verwendet werden (zB Distance(_,_ Node) ), aber zu diesem Zeitpunkt ist es aufgrund der Go 1 Zukunftskompatibilitätsgarantie . Wie auch erwähnt, ist ein möglicher Einwand gegen diese Tatsache, dass Parameter, selbst wenn sie nicht verwendet werden, implizit eine Dokumentation liefern können.

Kurz gesagt: Es gibt keine konkrete, konkrete Antwort, abgesehen davon, dass sie einfach eine letztlich willkürliche (aber immer noch gebildete) Entscheidung getroffen haben, dass unbenutzte Parameter wichtiger und nützlicher sind als ungenutzte lokale Variablen und Importe. Wenn es einmal einen starken Designgrund gab, ist es nirgendwo dokumentiert.

    
LinearZoetrope 21.03.2014, 03:11
quelle
0

Der Hauptgrund besteht darin, dass Sie Schnittstellen implementieren können, die bestimmte Methoden mit bestimmten Parametern diktieren, auch wenn Sie nicht alle in Ihrer Implementierung verwenden. Dies ist detailliert in @ Jsor Antwort.

Ein weiterer guter Grund ist, dass unbenutzte (lokale) Variablen oft das Ergebnis eines Fehlers oder der Verwendung eines Sprachmerkmals sind (zB Verwendung der kurzen Variablendeklaration := in einem Block, unbeabsichtigtes Abschatten einer "äußeren" Variablen) unbenutzte Funktionsparameter sind nie (oder sehr selten) das Ergebnis eines Fehlers.

Ein weiterer Grund kann die Weiterleitung Kompatibilität sein. Wenn Sie eine Bibliothek freigeben, können Sie die Parameterliste nicht ändern oder erweitern, ohne die Abwärtskompatibilität zu beeinträchtigen (und in Go gibt es keine Funktionsüberladung: Wenn Sie zwei Varianten mit unterschiedlichen Parametern haben möchten, müssen auch deren Namen anders sein).

Sie können eine exportierte Funktion oder Methode bereitstellen und zusätzliche - noch nicht verwendete - oder optionale Parameter (z. B. Hinweise ) in dem Sinne hinzufügen, dass Sie sie in einer zukünftigen Version / Version von deine Bibliothek.

Wenn Sie so früh dran sind, haben Sie den Vorteil, dass andere, die Ihre Bibliothek verwenden, nichts an ihrem Code ändern müssen.

Sehen wir uns ein Beispiel an:

Sie möchten eine Formatierungsfunktion erstellen:

%Vor%

Sie können auch sofort einen zusätzlichen Parameter hinzufügen:

%Vor%

Später können Sie Ihre Bibliothek und Ihre FormatSize() -Funktion verbessern, um die folgenden Formatierungsflags zu unterstützen:

%Vor%     
icza 17.11.2015 14:34
quelle