Go では、関数の引数として変数を渡すとコンパイラ エラーが発生することがありますが、ポインターを使用することで解決できます。ただし、& ポインターと * ポインターの区別はしばしば混乱を引き起こします。この記事は、両方のポインター型の違いと使用シナリオを明確にすることを目的としています。
この例では、エラーは、期待される引数の型と実際の引数の型の不一致が原因である可能性があります。変数が渡されました。 Decode 関数にはアドレスまたは User 構造体へのポインターが必要ですが、値を直接渡します。これを解決するには、& 演算子を使用してユーザー変数のアドレスを取得します。
if err := decoder.Decode(&u); err != nil { http.Error(rw, "could not decode request", http.StatusBadRequest) return }
ポインターは、他の変数のアドレスを保持する変数です。 & 演算子は変数のアドレスを返しますが、* 演算子を使用するとそのアドレスの値にアクセスできます。
上の例では、&u は User 構造体のアドレスを与え、それが User struct に渡されます。ポインタを期待する関数をデコードします。
ただし、次を使用して User インスタンスを作成した場合、
u := new(User)
はすでにポインターなので、& 演算子は必要ありません。
var u *User
& と * の主な違いは、* がアドレスに格納されている値へのリダイレクトを表すことです。 while & はアドレスを返します
例:
var y int var pointerToY *int var pointerToPointerToInt **int y = 10 pointerToY = &y pointerToPointerToInt = &pointerToY
現在:
& (演算子のアドレス):
例:
func swap(x, y *int) { *x, *y = *y, *x }
* (逆参照演算子):
例:
var p *int *p = 10
結論:
& および ポインタを理解することは、Go で変数を効率的に処理し、コンパイラ エラーに対処するために非常に重要です。主な違いは の「リダイレクト」動作にあり、& は変数の実際のアドレスを返します。意図された使用シナリオを慎重に検討することで、Go コード内でポインターを効果的に活用して、最適なパフォーマンスと正確性を実現できます。
以上がGo ポインター: `&` (アドレス) と `*` (逆参照) の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。