Dev Study
Go コース

34. メソッドセット — レシーバの選び方

型がどんなメソッドを持つかの集合を「メソッドセット」と呼びます。ここにはルールがあります。値型 T のメソッドセットには値レシーバのメソッドだけが含まれ、ポインタ型 *T のメソッドセットには値レシーバとポインタレシーバの両方が含まれます。つまりポインタの方がより多くのメソッドを持ちます。

このメソッドセットは、後で学ぶインターフェースを満たせるかどうかに直接影響します。あるインターフェースがポインタレシーバのメソッドを要求している場合、それを満たせるのはポインタ型 *T だけで、値型 T では満たせません。「ポインタレシーバのメソッドはポインタ経由でないとインターフェースに代入できない」という点が実務でよくつまずくところです。

選び方の指針はシンプルです。レシーバの状態を変更する、構造体が大きい、あるいは同じ型の他のメソッドが既にポインタレシーバである場合は、ポインタレシーバに統一します。逆に、小さくて不変な値(座標や時刻のような値オブジェクト)では値レシーバが自然です。迷ったら、まずポインタレシーバで一貫させると安全です。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗