ホームページ > バックエンド開発 > Golang > Go の「&」ポインタと「*」ポインタの違いは何ですか?それぞれをいつ使用する必要がありますか?

Go の「&」ポインタと「*」ポインタの違いは何ですか?それぞれをいつ使用する必要がありますか?

DDD
リリース: 2024-11-29 04:13:10
オリジナル
639 人が閲覧しました

What's the Difference Between `&` and `*` Pointers in Go, and When Should I Use Each?

& および * ポインターの使用法と区別を調べる

Go 関数を使用する場合、引数として変数を渡すことに関連するエラーが発生するのはかなり危険です。一般。 & または * で示されるポインターを使用すると、多くの場合、これらの問題を解決できます。ただし、それらの違いと適切な使用法を理解することが重要です。

定義と使用法

& 演算子は変数のメモリ アドレスを返し、* は変数の逆参照に使用されます。ポインタ。あなたの例では、u を User 型として定義しましたが、User へのポインターとしては定義しませんでした。その結果、json パッケージの Decode 関数はアドレスまたはポインターを必要とするため、&u を使用する必要がありました。

u が最初に u := new(User) または var u *User を使用してポインターとして作成された場合、 Decode への呼び出し内の & は不要になります。

アナロジーと例

ポインターは、アドレスを格納する変数と考えてください。私たちが住所から自宅を見つける方法と同様に、ポインタは特定のメモリ位置に保存されているデータを取得するのに役立ちます。

メモリ内の住所を表す変数 x があるとします。 &x と入力すると、実質的に x 自体のアドレスを取得することになります。ただし、*x と入力すると、x に保存されているメモリの場所にリダイレクトされ、そこにある実際のデータが取得されます。

たとえば、値 10 を保持する変数 y があり、それへのポインター、pointerToY、pointerToY は y のアドレスを保存します。

ここで、&y は y のアドレスを与えますが、&pointerToYポインタ自体のアドレスを提供します。

ポインタの楽しみ

概念をさらに詳しく説明するプログラムを次に示します。

package main

import "fmt"

func main() {
    var y int
    var pointerToY *int
    var pointerToPointerToInt **int

    y = 10
    pointerToY = &y
    pointerToPointerToInt = &pointerToY

    fmt.Println("pointerToY: ", pointerToY)
    fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt)

    fmt.Println("*pointerToY: ", *pointerToY) // dereferencing to get y's value
    fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt)

    fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt) // dereferencing twice to get y's value
}
ログイン後にコピー

このプログラムは、ポインターと逆参照を使用した場合のさまざまな結果を示しています。ポインターを介してリダイレクトすることでデータにアクセスする方法と、二重参照解除によって最終的に元のデータ値がどのように返されるかを示します。

以上がGo の「&」ポインタと「*」ポインタの違いは何ですか?それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート