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