ホームページ >バックエンド開発 >Golang >Go における値セマンティクスとポインター セマンティクスの違いは何ですか?

Go における値セマンティクスとポインター セマンティクスの違いは何ですか?

DDD
DDDオリジナル
2024-12-22 09:31:34241ブラウズ

What's the Difference Between Value and Pointer Semantics in Go?

Go における値とポインタのセマンティクスを理解する

Go では、関数やメソッドに値を渡すときに、値とポインタの概念によく遭遇します。ポインタのセマンティクス。これらの概念は、プログラム内でデータがどのように処理および変更されるかを理解する上で重要な役割を果たします。

値セマンティクス

値セマンティクスは、変数の値を次のように渡す場合に次のことを意味します。関数に引数を渡すと、その値のコピーが作成されて渡されます。この関数は、元の変数ではなく、コピーに対してのみ操作および変更できます。

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

func main() {
    i := 1
    fmt.Println("Original i:", i)  // 1
    fmt.Println("Doubled i:", double(i))  // 2
    fmt.Println("Updated i:", i)  // 1
}

この例では、i の値が double 関数にコピーされ、関数はコピーを変更します。 i の元の値は変更されません。

ポインター セマンティクス

値セマンティクスとは対照的に、ポインター セマンティクスとは、変数へのポインターを引数として渡すときの意味です。関数の場合、関数は元の変数を直接変更できます。

func doublePointer(ptr *int) {
    *ptr *= 2
}

func main() {
    i := 1
    fmt.Println("Original i:", i)  // 1
    fmt.Println("Doubled i:", doublePointer(&i))  // 2
    fmt.Println("Updated i:", i)  // 2
}

ここでは、i のアドレスをポインター (*) を使用する doublePointer 関数。その後、関数はアドレスの値を変更することができ、元の変数 i が更新されます。

スライス: ポインター セマンティクスのケース

Go の興味深い点は次のとおりです。スライスは値によって渡されますが、ポインター セマンティクスを示します。これは、スライスを関数に渡すと、関数は元のスライスからも参照される、基になる配列の要素を変更できることを意味します。

func doubleSlice(s []int) {
    for i := range s {
        s[i] *= 2
    }
}

func main() {
    is := []int{1, 2}
    fmt.Println("Original slice:", is)  // [1, 2]
    fmt.Println("Doubled slice:", doubleSlice(is))  // [2, 4]
    fmt.Println("Updated slice:", is)  // [2, 4]
}

この例では、スライスには基礎となる配列への参照が格納されるため、doubleSlice 関数は値としてその要素を変更できます。したがって、元のスライスの要素も更新されます。

Go で効果的にプログラミングするには、値とポインターのセマンティクスを理解することが重要です。これにより、開発者は関数内および関数間でデータを変更および共有する方法を制御できます。

以上がGo における値セマンティクスとポインター セマンティクスの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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