ホームページ  >  記事  >  バックエンド開発  >  Go言語のレシーバーとは何ですか?

Go言語のレシーバーとは何ですか?

PHPz
PHPzオリジナル
2023-06-10 11:06:061656ブラウズ

Go 言語では、レシーバーはメソッドのパラメーターとして存在するパラメーターを参照します。すべてのメソッドには受信機があります。実際、レシーバーとメソッドの組み合わせは、Go 言語でオブジェクト指向プログラミングを実装する方法です。

レシーバーは通常、メソッドの最初のパラメーターとして使用され、ポインター型または非ポインター型の独自の型を持ちます。ポインタ型レシーバは主にレシーバが指す変数を変更するために使用され、非ポインタ型レシーバは主に値型を転送するために使用されます。

メソッド呼び出し中、受信側はメソッドに渡される値と同じ型である必要があることに注意してください。ポインタ型受信機の場合は対応する値もポインタ型である必要があり、非ポインタ型受信機の場合は対応する値も非ポインタ型である必要があります。

たとえば、構造体を次のように定義するとします。

type User struct{
    name string
    age int
}

次に、この構造体にユーザー情報を出力するメソッドを定義したいとします。次のメソッドを定義できます:

func (u User) PrintInfo(){
    fmt.Printf("name: %s, age: %d", u.name, u.age)
}

この時点で、PrintInfo メソッドを呼び出してユーザーの情報を印刷できます:

user := User{"Jack", 18}
user.PrintInfo()  // 输出:name: Jack, age: 18

受信側 u のタイプは User で、このメソッドを表します。ユーザー構造に属します。メソッドの定義では、u.name と u.age を通じて構造体のメンバー変数にアクセスします。最後に、メソッドを呼び出すときに、user.PrintInfo() を通じて直接メソッドを呼び出すことができます。

Go 言語では、値型レシーバーに加えて、ポインター型レシーバーもサポートされています。ポインター型レシーバーを介して、構造体インスタンス内のメンバー変数を変更できます。

たとえば、User 構造の年齢を増やすメソッドを定義したいとします。次のメソッドを定義できます:

func (u *User) AddAge(i int){
    u.age += i
}

この時点で、AddAge メソッドを呼び出すことでユーザーの年齢を増やすことができます:

user := &User{"Tom", 20}
user.AddAge(1)
user.PrintInfo()  // 输出:name: Tom, age: 21

ここで渡されるのはユーザーの年齢であることに注意してください。構造体の値ではなくポインタです。これは、受信側がポインター型であるため、対応するポインターを渡す必要があるためです。

さらに、メソッドのレシーバーが非ポインター型の場合、そのレシーバーに対する変更操作によって新しい値が生成されることに注意することが重要です。したがって、メソッドを設計する際には特別な注意が必要です。

一般に、レシーバーは Go 言語において非常に重要な概念です。レシーバーを適切かつ合理的に使用することで、オブジェクト指向プログラミングの機能を簡単に実装できます。

以上がGo言語のレシーバーとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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