Golang(Go言語)では、関数を定義する際に、ポインタレシーバー(Pointer Receiver)と値レシーバー(Value Receiver)の2つのオプションがあります。これらは、メソッドを構造体に関連付ける方法を定義します。
値レシーバー(Value Receiver)
値レシーバーは、関数が特定の型の値をレシーバーとして受け取ることを示します。このような関数は、そのレシーバーが持つ値のコピーに対して動作します。つまり、レシーバーのフィールドの変更は、元のオブジェクトには影響を与えません。値レシーバーを使用することで、メソッドがオブジェクトを変更しないことを保証することができます。
ポインタレシーバー(Pointer Receiver)
ポインタレシーバーは、関数が特定の型のポインタをレシーバーとして受け取ることを示します。つまり、関数はそのポインタが指すオブジェクト自体を変更することができます。この場合、関数内での変更は元のオブジェクトに影響を与えます。
package main
import "fmt"
type Rectangle struct {
width, height float64
}
// value receiver
func (r Rectangle) SetValue(width, height float64) {
r.width = width
r.height = height
}
// pointer receiver
func (r *Rectangle) SetPointer(width, height float64) {
r.width = width
r.height = height
}
func main() {
rect := Rectangle{width: 10, height: 5}
// value receiver
rect.SetValue(20, 10)
// Output: Width: 10 Height: 5
fmt.Println("Value receiver - Width:", rect.width, "Height:", rect.height)
// pointer receiver
rect.SetPointer(20, 10)
// Output: Width: 20 Height: 10
fmt.Println("Pointer receiver - Width:", rect.width, "Height:", rect.height)
}
ポインタレシーバーを使用すると、関数がオブジェクトを直接変更できるため、大規模なオブジェクトの操作やメモリ効率の向上が可能になります。ただし、誤ってオブジェクトを変更する可能性があるため、注意が必要です。