33346


[net/http/cookiejar](https://golang.org/src/net/http/cookiejar/jar.go#L75)
に一見不思議そうなコードがありました。  
戻り値の型宣言では `error` を指定しているにも関わらず、関数内にはエラーを扱う箇所がなく必ず `nil` を返しています。

[code]

    func New(o *Options) (*Jar, error) {
        jar := &Jar{
            entries: make(map[string]map[string]entry),
        }
        if o != nil {
            jar.psList = o.PublicSuffixList
        }
        return jar, nil
    }
    
[/code]

本来であれば戻り値がひとつだけ（`*Jar` を返すだけ）で十分のように思えますが、Go言語的には何か意味のある書き方なのでしょうか？


CC BY-SA 3.0
2017-03-15T09:04:06.200
33341
2017-03-15T21:15:41.397
2017-03-15T21:15:41.397
2391
2391
question
go
cookiejar.Newが返すエラー値が必ずnilなのは何故か


未だにこの形で残っている主たる理由は、Go 1内での互換性のようです。

GoのGitHub上で[この件についてのIssue](https://github.com/golang/go/issues/18685)が2017年1月に立っていました。これによると、

  * 元々、何かしらの理由で戻り値にerrorが入れられる (将来的にerrorを返すことを見越したAPI設計かと予想されていますが確認されていません)。
  * その後そのまま放置され、今に至る。今更APIを変更すると互換性を失うので、そのままにしておく。

という経緯のようです。

元々cookiejarの今の形のデザインが議論されたのが[このメール](https://groups.google.com/forum/#!topic/golang-
dev/ygDB3nbir00/discussion)みたいですが特に説明はなく、ファイルの変化を追いつつソースのコミットやそのコードレビューを見ても特に説明になるようなコメントが残されていないので(※)、本当の所はAPI設計者に聞いてみるしか無さそうです。

  * 参考 
    * ["net/http/cookiejar: New does not need an error as return argument"](https://github.com/golang/go/issues/18685) \-- GitHub - golang/go
    * ["Go 1.1 cookiejar"](https://groups.google.com/forum/#!topic/golang-dev/ygDB3nbir00/discussion) \-- golang-dev

※
exp/cookiejarとして[最初に出来たとき](https://github.com/golang/go/blob/478aff3d4d7eea7f9980f960957eb21ae77aa2c2/src/pkg/exp/cookiejar/jar.go#L62)には戻り値にerrorが含まれておらず、その後上述のメールの通り[errorが含まれる形に変更](https://github.com/golang/go/blob/7d8cc587b2f459d773d71ec2e220173de6e60f86/src/pkg/exp/cookiejar/jar.go#L56)。この時にはまだ実装がありませんが、[その次のコミット](https://github.com/golang/go/blob/8c6489bc27b639487f56392d13c43f95fab0ac20/src/pkg/exp/cookiejar/jar.go#L67)で今の実装と同じものになっています。コードレビューの内容はコミットメッセージにリンクが貼られています。


CC BY-SA 3.0
2017-03-15T13:00:27.347
33346
2017-03-15T14:04:26.513
2017-03-15T14:04:26.513
19110
19110
33341
answer