【GO】interfaceを学びなおす


golangのinterfaceは使う機会も多いけど雰囲気で使っていた部分があります。

基本的なところからおさらい。

インターフェース

インターフェースはメソッド定義リストで、それを実装した型を受け入れます。

intを入れようとすると未実装エラーになります。

レシーバとしてSomeMethod()を実装した構造体Sは入れることができました。

 

これは関数実装などで特定のメソッドを実装した型を受け入れて処理を行ったりするのに使われます。

これによって複数の型(構造体)に共通するメソッドを作ることが可能になります。

こういったメソッドを作るために必要なメソッド定義がインターフェースです。

インターフェースは処理に必要なものだけ定義することを忘れないようにします。

空のインターフェース interface{}

引数などで一番よく見かけるものだと思います。

 

私は最初に調べた時interfaceinterface{}は別物だと見かけて変な思い込みがありましたがこれは同じものです。実装するべきメソッドが空なのでどんな型でも受け入れます。

type assertion と type switch

インターフェースは定義したメソッドを使用可能ですが、元の型(構造体)のメソッドやメンバを使うことができません。

型アサーションを使うことで元の構造体へ戻すことができます。

 

複数の型の処理にはtype switchが便利です。

インターフェースのポインタ

参照渡しで何でも受け入れる関数なんかを作ろうと考えてみる。

何でも入る空のinterface{}のポインタを引数にしてみるとこうなる。

インターフェースのポインタじゃなくてintのポインタだと怒られる。

 

なんらかの定義されたインターフェースなら渡せるのか。

実態は同じものだけど、これも通らない。

 

インターフェースのポインタはインターフェースのポインタしか受け付けない。

使い道もなくはなさそうだけど機会はまずないとおもう。

 

そもそもポインタもインターフェースとして扱えるのでそのまま渡すことができる。


コメントを残す

メールアドレスが公開されることはありません。