Go 言語の値渡しと参照渡しについての深い理解

WBOY
リリース: 2024-04-03 22:21:02
オリジナル
1083 人が閲覧しました

Go 言語には 2 つの転送メカニズムがあります: 値渡し: パラメーター値のコピーを渡します。コピーへの変更は元の値に影響しません。参照渡し: パラメーター値への参照を渡し、関数またはメソッドが元の値を変更できるようにします。これら 2 つのメカニズムを理解することは、コードの動作と効率に影響を与えるため、効率的で保守可能なコードを作成するために重要です。

Go 言語の値渡しと参照渡しについての深い理解

Go 言語における値渡しと参照渡しについての深い理解

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,原始值已更改
}
ログイン後にコピー

実用的なケース

ケース 1: String

Usefmt.Sprintf() 関数を渡すとき、値を渡しても元の文字列は変更されませんが、参照を渡すと次のようになります。

コード例:

// 传值
fmt.Sprintf("foo") // 返回新字符串 "foo",不影响原始字符串

// 传引用
s := "bar"
fmt.Sprintf(&s, "baz") // 修改 s 为 "baz"
ログイン後にコピー

ケース 2: スライス

スライスは参照型であるため、常に参照によって渡されます。これに加えられた変更は、元のスライスに影響します:

コード例:

s := []int{1, 2, 3}
func modifySlice(slice []int) {
    slice[1] = 0
}
modifySlice(s)
fmt.Println(s) // 输出 [1, 0, 3],原始切片已被修改
ログイン後にコピー

パフォーマンスに関する考慮事項

参照渡しでは、一般にパフォーマンスのオーバーヘッドが高くなります。関数またはメソッドは、基になる値にアクセスする必要があります。ただし、大きな値 (配列や構造体など) をコピーすることが現実的でない場合など、参照渡しの方が効率的な場合もあります。

結論

Go 言語の値渡しと参照渡しを理解することは、効率的で保守可能なコードを作成するのに役立つため、非常に重要です。データの種類と予想される操作に基づいて、適切な配信メカニズムを選択することが重要です。

以上がGo 言語の値渡しと参照渡しについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!