interfaceの概要
インターフェースの定義と実装 Goの予約語 | ||
interface 概要 |
||
|
基本的なinterfaceの使い方
以下のコードは、インターフェースを使って異なる型に共通のメソッドを持たせる例です。
package main
import "fmt"
// インターフェースの定義
type Speaker interface {
Speak() string
}
// 構造体の定義とインターフェースの実装
type Human struct {
Name string
}
func (h Human) Speak() string {
return "こんにちは、私は" + h.Name + "です。"
}
type Robot struct {
Model string
}
func (r Robot) Speak() string {
return "私はロボット" + r.Model + "です。"
}
// インターフェースを利用する関数
func introduce(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
h := Human{Name: "太郎"}
r := Robot{Model: "X100"}
introduce(h)
introduce(r)
}
解説:
Speaker
インターフェースはSpeak()
メソッドを定義します。Human
とRobot
構造体は、それぞれSpeak()
メソッドを実装しています。introduce()
関数は、Speaker
インターフェースを引数にとり、Speak()
メソッドを呼び出します。- Goでは明示的な
implements
キーワードが不要で、Speak()
メソッドを持つ型は自動的にSpeaker
を実装しているとみなされます。
実行結果:
こんにちは、私は太郎です。 私はロボットX100です。
空のインターフェース(interface{})
Goでは、空のインターフェース(interface{}
)を使うことで、あらゆる型を受け入れることができます。
package main
import "fmt"
func describe(i interface{}) {
fmt.Printf("値: %v, 型: %T\n", i, i)
}
func main() {
describe(42)
describe("Hello")
describe(3.14)
}
解説:
interface{}
は、どんな型の値でも受け取ることができる特殊なインターフェースです。describe()
関数では、interface{}
型の引数を受け取り、値と型を出力しています。
実行結果:
値: 42, 型: int 値: Hello, 型: string 値: 3.14, 型: float64
型アサーション
空のインターフェースを使用する際、型アサーションを使って元の型に変換できます。
package main
import "fmt"
func main() {
var i interface{} = "Hello"
str, ok := i.(string)
if ok {
fmt.Println("文字列:", str)
} else {
fmt.Println("型変換に失敗しました")
}
}
解説:
i.(string)
のように書くことで、インターフェースの値を文字列型に変換できます。- 変換が成功すると
str
に値が格納され、ok
がtrue
になります。 - 変換に失敗すると、
ok
がfalse
となり、エラーを防ぐことができます。
実行結果:
文字列: Hello
注意事項
- インターフェースは暗黙的に実装される: 他の言語のような
implements
キーワードは不要。 - インターフェースを変更すると影響範囲が広がる: 既存の実装と互換性を考慮すること。
- 空のインターフェースは乱用しない: 型安全性が失われやすく、可能な限り具体的な型を使用するのが望ましい。
よくある質問
- Q: interfaceは他の言語の抽象クラスと同じですか?
- A: いいえ。Goのインターフェースはメソッドの集合を定義するだけで、実装の詳細は持ちません。
- Q: 明示的にインターフェースを実装する方法はありますか?
- A: ありません。Goではインターフェースのメソッドを実装するだけで、自動的に適用されます。
- Q: インターフェースを使うメリットは?
- A: 異なる型に共通の動作を持たせたり、依存関係を疎結合にすることができます。
- Q: 空のインターフェースはいつ使うべきですか?
- A: 任意の型を受け付けたい場合に使いますが、多用すると型安全性が失われるため注意が必要です。
まとめ
interface
はGoでメソッドの集合を定義するための型。- Goでは暗黙的にインターフェースを実装する。
- 空のインターフェースを使うと、あらゆる型を受け取ることが可能。
- 型アサーションを使うことで、インターフェースの値を元の型に戻せる。