Nakedretは、指定された関数長よりも大きい関数で裸のリターンを見つけるためのGO静的分析ツールです。
GOインストール経由でNakedRretをインストールしてください:
go install github.com/alexkohler/nakedret/v2/cmd/nakedret @ latest GOPATH/binディレクトリをPATH環境変数にまだ追加していない場合は、そうする必要があります。
Windows(CMD):
set PATH = %PATH% ;C:yourGOPATHbinBASH(パスが設定されていることを確認できます):
# Check if nakedret is on PATH
which nakedret
export PATH= $PATH :/your/GOPATH/bin # to set path if it does not exist 他のGO静的Anaylsisツール( golint 、 go vetなど)と同様に、Nakedretは、その輸入パスで名前が付けられた1つ以上のファイル名、ディレクトリ、またはパッケージで呼び出すことができます。 Nakedretは...ワイルドカードもサポートしています。
nakedret [flags] files/directories/packages
現在、サポートされているフラグは-Lで、関数が(ラインの長さの観点から)可能な最大長を指定するためのオプションの数値フラグです。指定されていない場合、デフォルトは5になります。
go vetを使用して実行することもできます。
go vet -vettool= $( which nakedret ) ./...Goのコードレビューコメントに記載されているように:
関数が一握りの行であれば、裸のリターンは大丈夫です。中サイズの機能になったら、返品値を明示してください。結果:裸のリターンを使用できるという理由だけで、結果パラメーターを名前を付ける価値はありません。ドキュメントの明快さは、機能に1つか2行を保存するよりも常に重要です。
このツールは、非自明の機能で裸のリターンをキャッチすることを目的としています。
例として、GOソースのtypesパッケージを取得しましょう。
$ 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以下は、nakedretによって見つかったtypes/lookup.goの裸のリターンのそれほど直感的ではない用途の1つです(nakedretは関数の最後の裸のリターンのライン番号を返します):
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の切り替えをサポートすることは、一部の人にとっては役立つかもしれません。リクエストをプル歓迎!
Nakedretを楽しんでいる場合は、他の静的Anaylsisツールをご覧ください!