Go におけるメソッド バインディング: パラメーターとレシーバーを理解する
Go では、メソッドは型と密接に関連しています。型のメソッドを定義するとき、メソッドを型に直接アタッチするか、引数として渡すかを指定できます。メソッド バインディングとして知られるこの概念は、Go のプログラミング モデルを理解する上で中心となります。
次のメソッド シグネチャを考えてみましょう。
func (p *Page) save() error { // ... }
ここで、p は受信側であり、特別な種類のパラメータ。 Go では、レシーバーは常にメソッドの最初のパラメーターであり、メソッドがアタッチされる型を明示的に識別します。この場合、save は、Page 構造体へのポインターを表す *Page 型にアタッチされます。
受信側では、メソッドが受信側オブジェクトのインスタンス データにアクセスできるようになります。メソッドが呼び出されると、レシーバーは基になるインスタンスに自動的にバインドされます。このバインディングは呼び出し元には透過的ですが、メソッドにインスタンスのフィールドとメソッドへのアクセスを与えます。
対照的に、通常のパラメータは値として渡されます。つまり、実際のデータのコピーです。これらを使用して呼び出し元のインスタンス データにアクセスしたり、変更したりすることはできません。
レシーバーとパラメーターの区別をさらに明確にするために、次のコードを検討してください。
var p = new(Page) p.save() (*Page).save(p)
最後の 2 行はどちらも正確に表しています。同じメソッド呼び出しで、レシーバーがレシーバーの値によって表されるインスタンスにバインドされた特別な形式のパラメーターであることを示しています。
結論として、Go のレシーバーは次のようになります。メソッド シグネチャは、メソッドを、それが呼び出されるインスタンスの型にバインドする特別な種類のパラメータです。これにより、メソッドはインスタンスのデータにアクセスして操作できるようになりますが、パラメーターは値として渡され、呼び出し元のインスタンスを変更することはできません。 Go でメソッドを効果的に使用するには、この違いを理解することが不可欠です。
以上がGo メソッド: レシーバーとパラメーター: 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。