* に統一するtime.Time は全メソッドが値レシーバー = イミュータブル設計。Add は本体を変えず 新しい Time を返すだから「読むだけのメソッドなのに * が付いている」ことは普通に起きる。そのメソッド単体の都合ではなく、型全体の方針が理由になっているからだ。逆に time.Time のように全部が値レシーバーなら、「この型は誰にも書き換えられない」と型の側から読み取れる。
レシーバーを何にするか以前に、メソッドにするかどうかの判断がある。
ImportJobArgs はレシーバーなしの関数)* の有無は型ごとの方針として揃える。混ぜないと決めておけば、呼ぶ側は「この型は変更されうるか」を型単位で読めるようになる。
* の意味と3軸の判断(この話の親)