レシーバとは
Go言語における「レシーバ (Receiver)」は、他の言語でよく見られる「this」や「self」といったキーワードに相当する。Goのメソッド内でレシーバを介して構造体のメンバー変数やメソッドにアクセスすることができる。
例えばjavaの場合、クラスのメソッド内でクラスのメンバー変数にアクセスするためには this キーワードを使用します。Goにおけるメソッドではレシーバがその役割を果たし、構造体のフィールドやメソッドにアクセスするために利用される。
java / Go での比較
java
public class MyClass {
private int value;
public void setValue(int newValue) {
this.value = newValue; // "this"を使ってメンバー変数にアクセス
}
}
go
package main
import "fmt"
type MyClass struct {
value int
}
func (m *MyClass) SetValue(newValue int) {
m.value = newValue // レシーバを使ってメンバー変数にアクセス
}
func main() {
obj := MyClass{}
obj.SetValue(42)
fmt.Println(obj.value)
}
レシーバーの種類
値レシーバ
func (m MyClass) methodName() {
// 構造体がコピーが渡される。
// メソッド内での変更が元の構造体に影響を与えない。
}
ポインタレシーバ
func (m *MyClass) methodName() {
// 構造体へのポインタが渡される。
// メソッド内での変更が元の構造体に影響を与える。
}
構造体を参照しない場合
構造体を参照しない
func (MyClass) methodName() {
// メソッド内でレシーバを使わない
// Goの構文上、必ずレシーバを指定(記述)する必要がある。
}