Go言語100Tips ありがちなミスを把握し、実装を最適化する の No.42を読んだ。ここから第6章 関数とメソッド。
No.42は、値レシーバかポインタレシーバか、という話。基本的には、正当な理由がない限り値レシーバを使うべき、とのこと。正当な理由とは?
ポインタレシーバでなければならない場合
メソッドがレシーバを変更する必要がある場合。
メソッドのレシーバがコピーできないフィールドを含む場合。
ポインタレシーバであるべき場合
レシーバが大きなオブジェクトである場合。
値レシーバでなければならない場合
レシーバの不変性を強調する必要がある場合
レシーバがマップ、関数、チャネルの場合
また、レシーバの構造体の中の値を変更する場合、値レシーバでも実現可能だが、明確にレシーバが可変であることを強調するためにポインタレシーバにする方が良いかもしれない、とのこと。なるほど。
そして、レシーバ型の混在は一般的には避けるべきだが、絶対ではない。どうしても必要な場合はこの限りではない、見極めること。
とりあえずポインタでいいか、と、なりがちだったが、よく考えて使い分けたい。