ホームページ >バックエンド開発 >Golang >Go ポインター: `&` (アドレス) と `*` (逆参照) の違いは何ですか?

Go ポインター: `&` (アドレス) と `*` (逆参照) の違いは何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 18:59:09253ブラウズ

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& および * ポインター

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

現在:

  • y は値 10 を保持します。
  • *pointerToY y にリダイレクトし、その値を出力します10.
  • &y は y のアドレスを返します。
  • &pointerToY は pointerToY のアドレスを返します。
  • &pointerToPointerToInt は pointerToPointerToInt のアドレスを返します。
  • **pointerToPointerToInt値 10 を出力します。 y に到達するために 2 回リダイレクトします。

使用シナリオ

& (演算子のアドレス):

  • 変数のアドレスを関数に代入します。
  • 関数に代入する前にアドレスを取得するにはpointer.
  • 2 つのポインターを比較します。

例:

func swap(x, y *int) {
    *x, *y = *y, *x
}

* (逆参照演算子):

  • に保存されている値にアクセスするにはアドレス。
  • ポインターに値を割り当てる。
  • 2 つのポインターを比較する。

例:

var p *int

*p = 10

結論:

& および ポインタを理解することは、Go で変数を効率的に処理し、コンパイラ エラーに対処するために非常に重要です。主な違いは の「リダイレクト」動作にあり、& は変数の実際のアドレスを返します。意図された使用シナリオを慎重に検討することで、Go コード内でポインターを効果的に活用して、最適なパフォーマンスと正確性を実現できます。

以上がGo ポインター: `&` (アドレス) と `*` (逆参照) の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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