## What — 型ごとに揃える
- Go 公式指針:**1つの型に値/ポインタレシーバーを混在させない**。変更系メソッドが1つでもあれば全部 `*` に統一する
- 標準ライブラリの `time.Time` は全メソッドが値レシーバー = イミュータブル設計。`Add` は本体を変えず **新しい Time を返す**
だから「読むだけのメソッドなのに `*` が付いている」ことは普通に起きる。そのメソッド単体の都合ではなく、型全体の方針が理由になっているからだ。逆に `time.Time` のように全部が値レシーバーなら、「この型は誰にも書き換えられない」と型の側から読み取れる。
## How — そもそもメソッドにするか
レシーバーを何にするか以前に、メソッドにするかどうかの判断がある。
- その型のデータがないと成立しない処理 → **メソッド**
- レシーバーのデータを使わない処理 → **普通の関数でいい**(例:`ImportJobArgs` はレシーバーなしの関数)
> [!success]
> `*` の有無は型ごとの方針として揃える。混ぜないと決めておけば、呼ぶ側は「この型は変更されうるか」を型単位で読めるようになる。
## 関連
- [[Go]]
- [[Goメソッドレシーバー(ポインタ vs 値)]] — `*` の意味と3軸の判断(この話の親)