LoginSignup
0
0

More than 1 year has passed since last update.

【Go言語】interface定義内に別のinterfaceを埋め込む

Posted at

net/httpライブラリで気になる記述を見つけた

net/httpのGETを使ってレスポンス本体の内容を操作する、といったコードを書いていた時、
ふとResponse.Bodyの型を見てみるとio.ReadCloser interfaceが指定されていた。

response.go
type Response struct {
    /// ~~~ 省略 ~~~

    Body io.ReadCloser

    /// ~~~ 省略 ~~~
}

こいつのinterface定義を見てみるとこのように定義されていた。

io.go
// 定義①
type ReadCloser interface {
    Reader
    Closer
}

こんな感じのinterface定義は見るけど、上記のような定義はあまり見たことがなかったのでちょっと調べてみた。

io.go
type Writer interface {
    Write(p []byte) (n int, err error)
}

interfaceの埋め込みという記述らしい

先述の別interfaceを含むinterface内に出てきたReaderinterfaceとCloserinterfaceはそれぞれ下記のような定義だが、

io.go
type Reader interface {
    Read(p []byte) (n int, err error)
}

type Closer interface {
    Close() error
}

これらを両方の実装を要求するinterfaceを定義する際に定義①のような記述ができる。
これをinterfaceの埋め込みといい、下記の記述と同等の定義となる。

io.go
type ReadCloser interface {
    Read(p []byte) (n int, err error)
    Close() error
}

どんな場面で活用できるか

ReaderinterfaceとCloserinterfaceのような一つしか関数の実装要求をしないinterfaceならば、そのまま新しいinterface内に要求関数を記述してもいいように思えるが、簡潔な記述とメンテナンス性を考えるなら埋め込みを使ったほうがいい。

例えば、そもそもReaderinterfaceとCloserinterfaceが実装要求する関数がそれぞれ複数個あると、それを全部新しいinterfaceに記述するのは冗長だし、仮に初期実装時に実装要求する関数が少なくても後々増えたときにいちいちReadCloserinterfaceに定義を追加するのは面倒くさい。

なので、埋め込みを使うことで簡潔でメンテのしやすいコードを書くことができる。

type Reader interface {
    MethodA() error
    MethodB() error
    MethodC() error
    MethodD() error
    MethodE() error
    MethodF() error
}

type Closer interface {
    MethodG() error
    MethodH() error
    MethodI() error
    MethodJ() error
    MethodK() error
    MethodL() error
}

// ReaderもCloserも実装要求するようかけるが、冗長すぎる...
type ReadCloser interface {
    MethodA() error
    MethodB() error
    MethodC() error
    MethodD() error
    MethodE() error
    MethodF() error
    MethodG() error
    MethodH() error
    MethodI() error
    MethodJ() error
    MethodK() error
    MethodL() error
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0