Go では、関数の引数は値または参照で渡すことができます。値によって渡す場合、変数のコピーが作成され、関数に渡されます。参照渡しの場合、代わりに変数のアドレスが渡されるため、関数は元の値を変更できます。
この参照渡しの概念は、ポインターを使用して実現されます。ポインタは、別の変数のアドレスを保持する変数です。 & 演算子は変数のアドレスを返しますが、* 演算子はアドレスに格納されている値にアクセスするために使用されます。
& 演算子は変数を参照によって渡すために使用されます。関数の引数。たとえば、次の関数について考えてみましょう。
func SendNotification(user *User) { // ... }
この関数は引数として *User を予期します。ここで、* は引数が User 構造体へのポインタであることを示します。 User 型の変数 u を渡すには、次のように & 演算子を使用する必要があります。
SendNotification(&u)
これにより、u のアドレスが関数に渡され、元の値を変更できるようになります。
* 演算子は、アドレスに格納されている値にアクセスするために使用されます。たとえば、次のコードの場合:
var userPtr *User userPtr = &u
userPtr は、u に格納されている User 構造体のアドレスを保持するポインターです。このアドレスに格納されている値にアクセスするには、* 演算子を使用できます。
*userPtr = User{name: "John"}
これにより、userPtr に格納されているアドレスにある User 構造体に新しい値が割り当てられます。
& と * の違いは、その機能にあります。 & は変数のアドレスを取得するために使用され、参照によって渡すことができます。 * は、アドレスに格納されている値にアクセスするために使用され、元の値を変更できます。
実際には、& は関数への参照によって変数を渡すために一般的に使用され、* は格納された値を変更するために使用されます。メソッド内でポインタをレシーバとして使用する場合など、アドレスで使用します。
次のことを考慮してください。 code:
func main() { u := User{name: "Jane"} SendNotification(&u) // Passing by reference fmt.Println(u.name) // Prints "Jane" }
ここで、SendNotification 関数は引数として *User を取ります。 &u を渡すことで、関数が u の元の値を変更できるようになります。関数内で、値は次のように変更できます。
func SendNotification(user *User) { user.name = "John" }
これにより、参照によって渡された User 構造体の名前が変更されます。
以上がGo ポインター: 「&」と「*」の違いとその使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。