Golang 関数のパラメータの受け渡しには、値の受け渡しと参照の受け渡しの 2 つの方法があります。値渡しではパラメータのコピーが作成されますが、これは安全ですが高価です。参照渡しではパラメータ ポインタが渡されますが、これは安価ですが、元の値を変更するリスクと同時実行の問題が伴います。
Golang での関数パラメーター受け渡しの効率分析
関数パラメーター受け渡しは、特に大規模データの場合、プログラムのパフォーマンスにおいて重要な役割を果たします。構造物や複雑なオブジェクト。 Golang は、関数パラメータを渡す 2 つの方法、値の受け渡しと参照の受け渡しを提供します。
値の受け渡し
値の受け渡しでは、パラメーター値のコピーを作成し、それを関数に渡します。関数内のパラメーターを変更しても呼び出し元の元の値に影響を与えないため、これは安全な受け渡し方法です。ただし、渡されたパラメータが大規模なデータ構造または複雑なオブジェクトである場合、追加のメモリ オーバーヘッドとコピー時間が発生します。
func foo(x int) { x++ // 修改 x 的副本,不会影响调用者原始值 }
参照渡し
参照渡しでは、値そのものではなく、パラメーターのポインターが渡されます。これにより、特に大規模なデータ構造や複雑なオブジェクトを渡す場合に、メモリのオーバーヘッドとコピー時間を大幅に削減できます。ただし、参照渡しには次のような欠点があります。
func foo(x *int) { *x++ // 修改原始值,因为传递的是指针 }
実践的なケース
値の受け渡しと参照の受け渡しのパフォーマンスを比較する実践的なケースを次に示します。
package main import ( "fmt" "time" ) type LargeStruct struct { Data []byte } func main() { // 创建一个大型结构 largeStruct := &LargeStruct{Data: make([]byte, 1000000)} // 使用值传递 start := time.Now() for i := 0; i < 100000; i++ { foo(largeStruct) } elapsed1 := time.Since(start) // 使用引用传递 start = time.Now() for i := 0; i < 100000; i++ { fooPtr(largeStruct) } elapsed2 := time.Since(start) fmt.Println("值传递耗时:", elapsed1) fmt.Println("引用传递耗时:", elapsed2) } func foo(largeStruct LargeStruct) {} func fooPtr(largeStruct *LargeStruct) {}
この場合, 値渡しは、foo 関数が呼び出されるたびに大きな構造全体がコピーされるため、参照渡しよりもはるかに遅くなります。
以上がGolangで渡す関数パラメータの効率解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。