Go の括弧で囲まれた構文を使用した関数宣言を理解する
Go では、関数宣言に関数名の前に括弧を含めることができます。これらのかっこは、メソッド定義で重要な役割を果たすレシーバーを囲みます。
レシーバーは、メソッドが動作するオブジェクトです。次の例を考えてみましょう。
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... } func (s *GracefulServer) BlockingClose() bool { ... }
最初の例では、受信側は (h ハンドラー) です。これは、ServeHTTP メソッドがハンドラー値タイプに属していることを示します。レシーバーを囲む括弧は、メソッドを定義するための必須の構文であり、通常の関数と区別されます。
2 番目の例では、レシーバーは (s *GracefulServer) です。ここで、BlockingClose メソッドは *GracefulServer ポインター タイプに属します。アスタリスク * はポインターを表し、メソッドが GracefulServer オブジェクトへのポインターで動作することを示します。
レシーバーは、他のオブジェクト指向言語の this キーワードのように動作します。これにより、メソッドがレシーバーのプロパティにアクセスして変更し、それが属するオブジェクトの状態を効果的に変更できるようになります。
メソッドを呼び出すと、レシーバーは他の引数と同様に呼び出しスタックにプッシュされます。レシーバーが値型の場合 (ハンドラーの場合など)、メソッド内で行われた変更は、関数呼び出しが返された後は保持されません。このような場合、永続的な変更を保証するには、ポインター レシーバーを使用するか、変更された値を返すことが重要です。
詳細については、メソッド セットに関する Go 言語仕様のセクションを参照してください: https://golang.org/ ref/spec#Method_sets
以上がGo 関数宣言のかっこはメソッドとレシーバーをどのように定義しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。