Go 言語には 2 つの転送メカニズムがあります: 値渡し: パラメーター値のコピーを渡します。コピーへの変更は元の値に影響しません。参照渡し: パラメーター値への参照を渡し、関数またはメソッドが元の値を変更できるようにします。これら 2 つのメカニズムを理解することは、コードの動作と効率に影響を与えるため、効率的で保守可能なコードを作成するために重要です。
Go 言語では、2 つの異なる転送メカニズムが関係します。パラメータを渡すとき: 値渡しおよび参照渡し。コードの動作と効率に影響を与えるため、両方のメカニズムを理解することが重要です。
値による受け渡しでは、パラメーター値のコピーが関数またはメソッドに渡されます。これは、コピーに加えられた変更が元の値に影響を与えないことを意味します。
コード例:
func changeValue(value int) { value++ // value 副本增加 1 } func main() { value := 5 changeValue(value) fmt.Println(value) // 输出 5,原始值未更改 }
参照渡しの場合、パラメーター値の参照が関数またはメソッドに渡されます。これにより、関数またはメソッドで元の値を変更できるようになります。
コード例:
func changeReference(ptr *int) { *ptr++ // 对 *ptr 指向的值增加 1 } func main() { value := 5 changeReference(&value) fmt.Println(value) // 输出 6,原始值已更改 }
Usefmt.Sprintf()
関数を渡すとき、値を渡しても元の文字列は変更されませんが、参照を渡すと次のようになります。
コード例:
// 传值 fmt.Sprintf("foo") // 返回新字符串 "foo",不影响原始字符串 // 传引用 s := "bar" fmt.Sprintf(&s, "baz") // 修改 s 为 "baz"
スライスは参照型であるため、常に参照によって渡されます。これに加えられた変更は、元のスライスに影響します:
コード例:
s := []int{1, 2, 3} func modifySlice(slice []int) { slice[1] = 0 } modifySlice(s) fmt.Println(s) // 输出 [1, 0, 3],原始切片已被修改
参照渡しでは、一般にパフォーマンスのオーバーヘッドが高くなります。関数またはメソッドは、基になる値にアクセスする必要があります。ただし、大きな値 (配列や構造体など) をコピーすることが現実的でない場合など、参照渡しの方が効率的な場合もあります。
Go 言語の値渡しと参照渡しを理解することは、効率的で保守可能なコードを作成するのに役立つため、非常に重要です。データの種類と予想される操作に基づいて、適切な配信メカニズムを選択することが重要です。
以上がGo 言語の値渡しと参照渡しについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。