ホームページ >バックエンド開発 >Golang >値とポインターのセマンティクスは Go での変数の変更にどのように影響しますか?

値とポインターのセマンティクスは Go での変数の変更にどのように影響しますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-16 17:52:121044ブラウズ

How Do Value and Pointer Semantics Affect Variable Modification in Go?

Go の値とポインターのセマンティクス

Go は、値が関数またはメソッドに渡されるタイミングを指示する値セマンティクスの原則に準拠しています。 、それらの値のコピーが作成されます。したがって、関数内のコピーに加えられた変更は、元の値には影響しません。

この動作は、次の例で明らかです。

func main() {
    i := 1
    fmt.Println("double:", double(i))
    fmt.Println("original i:", i)
}

func double(i int) int {
    i *= 2
    return i
}

出力:

double: 2
original i: 1

図に示すように、値セマンティクスを使用して関数内の値を変更しても、元の値には影響しません。

対照的に、ポインター セマンティクスでは、値によって渡された場合でも、呼び出し先は元の値を変更できます。これを実現するには、元の値へのポインタを渡す必要があります。

func main() {
    i := 1
    fmt.Println("double:", doublep(&i))
    fmt.Println("original i:", i)
}

func doublep(i *int) int {
    *i *= 2
    return *i
}

出力:

double: 2
original i: 2

Go のスライスはポインタ セマンティクスを示します。スライスは値によって渡されますが、スライスには基礎となる配列へのポインタが含まれています。スライスが関数に渡されると、スライス ヘッダーのコピーが作成されますが、基になる配列への同じポインターが維持されます。その結果、関数内のスライス要素に加えられた変更は、元のスライスに反映されます。

func main() {
    is := []int{1, 2}
    fmt.Println("double:", doubles(is))
    fmt.Println("original is:", is)
}

func doubles(is []int) []int {
    for i := range is {
        is[i] *= 2
    }
    return is
}

出力:

double: [2 4]
original is: [2 4]

このメカニズムにより、関数内のスライス要素に加えられた変更が可能になります。元のスライスに伝播される関数。ただし、配列は値のセマンティクスに従い、配列を渡すとそのすべての要素のコピーが作成されます。

以上が値とポインターのセマンティクスは Go での変数の変更にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。