web-dev-qa-db-ja.com

Golang:ポインターを使用する場合

私はGo言語の初心者であり、C/C++のバックグラウンドが最小限であるため、当然、ポインターを使用するタイミングと使用しないタイミングのアイデアに苦労しています。この質問は無制限と考えられるかもしれませんが、構造体を返すタイミングとポインターを返すタイミングに関するいくつかのガイドライン(および構造体/ポインターを引数として受け入れるタイミング)について疑問に思っています。

私が推測できることから、次のステートメントが当てはまります。

  1. 構造体は値によって関数に渡されます。つまり、関数に渡すときに構造のコピーが作成されます。
  2. 構造体を参照渡ししたい場合は、代わりに関数定義でポインター引数を使用し、関数を呼び出すときにaddressof演算子を使用します。
  3. 参照によって構造体を渡したい理由は、私が渡している構造体が大きく、値で渡すことはメモリに負担をかけているためです(ほとんどありません)、または変更する場合私が渡そうとしているコピー(可能性が高い)。
  4. 3.)の帰結として、上記の参照のいずれかの理由がない限り、値渡しする必要があります。

私の仮定は正しいですか?または、ポインターのマークがありませんか?

47
Jim Pedid

あなたの仮定は正しいです。 #3については、Goは並行言語であり、goroutinesで参照渡しすることで、それらはすべて同じ構造を読み取って安全になりますが、同じ構造を変更して危険になります。

23
Uvelichitel