Go の関数宣言構文: 括弧を解く
Go コード内では、関数名の前に括弧で囲まれた要素を含む関数宣言が見つかることがあります。 。これらのかっこには、関数の動作を定義する際の特定の役割があります。
レシーバー: 概要
かっこで囲まれた要素は、関数のレシーバーを表します。レシーバーは、メソッドが呼び出される型です。ある意味、これはオブジェクト指向プログラミングのクラスとして機能し、メソッドが操作するエンティティを表します。
値およびポインターの受信者
受信者は次のいずれかを行うことができます。値型またはポインタ型になります。値レシーバーは値によって渡されます。つまり、関数内でレシーバーに加えられた変更は呼び出しスコープには反映されません。一方、ポインター レシーバーは参照によって渡されるため、関数内で行われた変更は関数が返された後も保持されます。
たとえば、次の関数には値レシーバーがあります:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... }
ハンドラー変数が ServeHTTP 関数内で変更された場合 (例: h.Name = "Evan")、その変更は関数の実行後に保存されません。
対照的に、次の関数にはポインター レシーバーがあります:
func (s *GracefulServer) BlockingClose() bool { ... }
BlockingClose 関数内で GracefulServer インスタンスに加えられた変更は、呼び出し元のスコープに反映されます。
関数宣言の解析
完全に理解するにはレシーバーを使用した関数宣言の意味を理解するには、レシーバーの型と関数のシグネチャの両方を考慮する必要があります。
たとえば、次の宣言は、
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... }
関数 ServeHTTP が次のとおりであることを示します。ハンドラー タイプに関連付けられ、http.ResponseWriter と a の 2 つの引数を取ります。 *http.Request.
結論
Go 関数宣言の関数名の前にある括弧で囲まれた要素は、レシーバー、つまりメソッドが呼び出される型を表します。レシーバーは値型またはポインター型にすることができ、どちらを選択するかは、レシーバーへの変更を呼び出し元のスコープ内で保持する必要があるかどうかによって決まります。
以上がGo 関数名の前のかっこの目的は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。