Nakedret ist ein GO -statischer Analyse -Tool, um nackte Renditen in Funktionen zu finden, die größer als eine bestimmte Funktionslänge sind.
Installieren Sie Nakedret über Go Installation:
go install github.com/alexkohler/nakedret/v2/cmd/nakedret @ latest Wenn Sie Ihr GOPATH/bin -Verzeichnis noch nicht zu Ihrer PATH hinzugefügt haben, müssen Sie dies tun.
Windows (CMD):
set PATH = %PATH% ;C:yourGOPATHbinBash (Sie können überprüfen, ob ein Pfad festgelegt wurde):
# Check if nakedret is on PATH
which nakedret
export PATH= $PATH :/your/GOPATH/bin # to set path if it does not exist Ähnlich wie bei anderen Go -statischen Anaylsis -Tools (wie golint , go vet ) kann Nakedret mit einem oder mehreren Dateinamen, Verzeichnissen oder Paketen aufgerufen werden, die von seinem Importpfad benannt sind. Nakedret unterstützt auch die ... Wildcard.
nakedret [flags] files/directories/packages
Derzeit ist das einzige unterstützte Flag -L -L, ein optionales numerisches Flag, um die maximale Länge anzugeben, die eine Funktion (in Bezug auf die Leitungslänge) sein kann. Wenn nicht angegeben, wird es standardmäßig 5.
Es kann auch mit go vet ausgeführt werden:
go vet -vettool= $( which nakedret ) ./...Wie in Go's Code Review Kommentare erwähnt:
Nackte Renditen sind in Ordnung, wenn die Funktion eine Handvoll Linien ist. Sobald es sich um eine mittelgroße Funktion handelt, seien Sie mit Ihren Rückgabewerten explizit. Folgerung: Es lohnt sich nicht, Ergebnisparameter zu benennen, nur weil Sie nackte Rückgaben verwenden können. Klarheit von Dokumenten ist immer wichtiger als das Speichern einer oder zwei Zeilen in Ihrer Funktion.
Dieses Tool zielt darauf ab, nackte Renditen für nicht triviale Funktionen zu erfassen.
Nehmen wir das types in der GO -Quelle als Beispiel:
$ nakedret -l 25 types/
types/check.go:245 checkFiles naked returns on 26 line function
types/typexpr.go:443 collectParams naked returns on 53 line function
types/stmt.go:275 caseTypes naked returns on 27 line function
types/lookup.go:275 MissingMethod naked returns on 39 line function Unten finden Sie eine der nicht so intuitiven Verwendungen von nackten Renditen in types/lookup.go von Nakedret (Nakedret gibt die Zeilennummer der letzten nackten Rückgabe in der Funktion zurück):
func MissingMethod ( V Type , T * Interface , static bool ) ( method * Func , wrongType bool ) {
// fast path for common case
if T . Empty () {
return
}
// TODO(gri) Consider using method sets here. Might be more efficient.
if ityp , _ := V . Underlying ().( * Interface ); ityp != nil {
// TODO(gri) allMethods is sorted - can do this more efficiently
for _ , m := range T . allMethods {
_ , obj := lookupMethod ( ityp . allMethods , m . pkg , m . name )
switch {
case obj == nil :
if static {
return m , false
}
case ! Identical ( obj . Type (), m . typ ):
return m , true
}
}
return
}
// A concrete type implements T if it implements all methods of T.
for _ , m := range T . allMethods {
obj , _ , _ := lookupFieldOrMethod ( V , false , m . pkg , m . name )
f , _ := obj .( * Func )
if f == nil {
return m , false
}
if ! Identical ( f . typ , m . typ ) {
return m , true
}
}
return
}build.Context.UseAllFiles kann für einige nützlich sein.Anfragen willkommen!
Wenn Sie Nakedret genossen haben, schauen Sie sich meine anderen statischen Anaylsis -Tools an!