「golangのコンストラクタでinterface型を返すようにする理由」とそこからリンクされている という記事を見て,なかなか面白いけど「理由」としてはイマイチな気がするので,この記事でも少し考えてみる。 ”Accept Interfaces, Return Structs” Go の設計指針として有名な言葉に ”Accept Interfaces, Return Structs” と言うのがある。つまり返り値としては具体的な型を返すけど,格納するインスタンスや関数の引数などは interface 型で受け入れる,というもの。 たとえば 指定したファイルをオープンする オープンしたファイルの内容を全て読み込む という関数をそれぞれ作る場合 func OpenFile(path string) (*os.File, error) { return os.Open(path) } func