eold の答えは興味深く、創造的で、おそらく賢いものです。
ただし、代わりに次のことをお勧めします。
var index int
if val > 0 {
index = printPositiveAndReturn(val)
} else {
index = slowlyReturn(-val) // or slowlyNegate(val)
}
はい、両方とも本質的に同じアセンブリにコンパイルされますが、このコードは、最初に変数に書き込むことができた値を返すためだけに無名関数を呼び出すよりもはるかに読みやすいです。
基本的に、シンプルで明確なコードはクリエイティブなコードよりも優れています。
さらに、Go ではマップはまったく軽量ではないため、マップ リテラルを使用するコードはお勧めできません。Go 1.3以降、小さなマップのランダムな反復順序が保証されています.これを強制するために、小さなマップのメモリ効率はかなり低下しています.
その結果、多数の小さなマップを作成および削除するには、スペースと時間がかかります。小さなマップを使用するコードがありました (2 つまたは 3 つのキーである可能性が高いですが、一般的な使用例は 1 つのエントリのみでした)。しかし、コードは非常に低速でした。デュアル スライス key[index]=>data[index] マップを使用するように書き直された同じコードよりも、少なくとも 3 桁は遅くなります。そしておそらくもっとでした。以前は実行に数分かかっていた一部の操作が、ミリ秒単位で完了するようになりました.\