& および * ポインターの使用法と区別を調べる
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 サイトの他の関連記事を参照してください。