効率的な Go 関数を作成するには、次のガイドラインに従ってください。 グローバル変数の使用は避けてください。小さい値の型の場合は値で渡し、大きい値の型の場合はポインターで渡します。必要な場合にのみ値を割り当てます。インライン関数を使用します。パラメータの数を減らします。
Go 効率的な関数の作成ガイド
効率的な関数は、効率的な Go プログラムを作成するための鍵です。これらのガイドラインに従うことで、効率的で読みやすい関数を作成できます。
1. グローバル変数を避ける
グローバル変数はプログラムのどこからでも変更できるため、コードの保守とテストが困難になります。代わりに、変数を特定の関数または型に制限します。
2. 値渡しを使用する
Go の関数は、デフォルトで値によって渡されます。これは、関数に渡される変数のコピーが関数に渡されることを意味します。これは、int、float、string などの小さい値型の場合により効率的です。大きな値の型 (配列やスライスなど) の場合は、代わりにポインター受け渡しを使用する必要があります。
3. ポインターを使用した受け渡し
ポインターを介して大きな値を渡すと、関数が元の値を直接変更できるため、値全体をコピーするオーバーヘッドが回避されます。関数内で値を変更する必要がある場合は、ポインターを使用して値を渡します。
4. パラメータの数を減らす
関数のパラメータが増えると、プログラムの可読性とデバッグ性が低下します。関数に複数のパラメーターが必要な場合は、構造体を作成するか、関連するパラメーターを 1 つの値に結合することを検討してください。
5. 不必要な割り当てを避ける
新しい値を割り当てると、パフォーマンスのオーバーヘッドが発生します。必要な場合にのみ値を割り当てます。たとえば、反復ごとに新しい値を割り当てる代わりに、ループ内でバッファーを使用します。
6. インライン関数を使用する
インライン関数は、関数本体を呼び出しポイントに直接挿入します。これにより、特に関数本体が小さい場合に、関数呼び出しのオーバーヘッドを軽減できます。
実践的なケース:
次の例では、値渡しとポインター渡しのパフォーマンスを比較しています。
package main import "testing" type Data struct { Value int } func passByValue(d Data) { d.Value += 1 } func passByPointer(d *Data) { d.Value += 1 } func BenchmarkPassByValue(b *testing.B) { d := Data{Value: 0} for i := 0; i < b.N; i++ { passByValue(d) } } func BenchmarkPassByPointer(b *testing.B) { d := Data{Value: 0} for i := 0; i < b.N; i++ { passByPointer(&d) } }
実行スコアの結果は、ポインターの受け渡しの比率は、値による受け渡しの方がはるかに高速です:
BenchmarkPassByValue-8 10000000 148 ns/op BenchmarkPassByPointer-8 100000000 24.2 ns/op
以上がGolang の効率的な関数作成ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。