質問のタイトルでもっと具体的に説明できなかったことをお詫びしますが、私はいくつかの行くコードを読んでいて、次のような形式の関数宣言に遭遇しました。
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
からhttps://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
からhttps://github.com/braintree/manners/blob/master/server.go
(h handler)
括弧内のと はどういう(s *GracefulServer)
意味ですか? 括弧内の意味を考慮すると、関数宣言全体はどういう意味ですか?
編集
これは重複ではありませんGo の関数とメソッドの違いは何ですか?: この疑問は、関数名の前の括弧内のものが何なのかわからなかったために思いついたのであって、関数とメソッドの違いは何かと疑問に思ったからではありません。この宣言がメソッドだと知っていたら、そもそもこの疑問は抱かなかったでしょう。誰かがいつか私と同じ疑問を抱いたとしても、その人が「golang メソッド」を検索しようとはしないと思います。なぜなら、その人が「golang メソッド」を検索したがらないからです。それは、数式の前にある文字「シグマ」が何を意味するのか疑問に思い (それが合計を意味することを知らず)、誰かが「合計と他の何かの違いは何ですか」の繰り返しだと言うようなものです。
また、この質問に対する短い答え (「レシーバーです」) は、「関数とメソッドの違いは何ですか」という質問に対する答えにはなりません。
ベストアンサー1
これは「レシーバー」と呼ばれます。最初のケースで(h handler)
は値型、2 番目のケースで(s *GracefulServer)
はポインターです。Go でのこの動作は、他の言語とは少し異なる場合があります。ただし、受信型は、ほとんどのオブジェクト指向プログラミングのクラスとほぼ同じように動作します。これは、メソッドを呼び出すものです。A
クラス内にメソッドを配置する場合、呼び出すにはPerson
型のインスタンスが必要になります(インスタンス メソッドであり、静的ではないと仮定した場合)。Person
A
ここでの注意点の 1 つは、レシーバーが他の引数と同様に呼び出しスタックにプッシュされることです。したがって、 の場合のようにレシーバーが値型である場合は、handler
メソッドを呼び出した元のコピーに対して作業することになります。つまり、 のようなものは、h.Name = "Evan"
呼び出しスコープに戻った後は存続しません。このため、レシーバーの状態を変更することが予想される場合は、ポインターを使用するか、変更された値を返す必要があります (探しているのであれば、不変型のパラダイムがより多く提供されます)。
以下は仕様の関連セクションです。メソッドセット