今回は、Golangのinterface型についてまとめていきたいと思います。
特にGoで開発を行う時、Empty Interfaceをよく使うので、Empty interfaceについても記述しておきました。
Go Interface
type Shape interface {
area() float64
perimeter() float64
}
- インタフェースはメソッドの集合体です。
- インタフェースはタイプ(type)が実装すべきのメソッドのそのものを定義します。(prototype)
- 一つのユーザー定義タイプのインタフェースを実装するためには、そのインタフェースが持っている全てのメソッドを実装すれば良いです。
Interface実装
type Rect struct {
width, height float64
}
//Rectタイプに対するShapeインタフェースを実装
func (r Rect) area() float64 { return r.width * r.height }
func (r Rect) perimeter() float64 {
return 2 * (r.width + r.height)
}
- 上記の例はRectタイプがある場合のShapeインタフェースを実装しています。
- area()、perimeter()を実装する必要があります。
Interfaceタイプ
func Marshal(v interface{}) ([]byte, error);
func Println(a ...interface{}) (n int, err error);
- 上記はGoでプログラミングを行う時、よく見つかるEmpty interfaceです。
- Empty interfaceはメソッドを持っていないインタフェースです。
- Empty interfaceにはどのタイプでも保存できるコンテナとも呼びます。
package main
import "fmt"
func main() {
var x interface{}
x = 1
x = "こんにちは"
printIt(x)
}
func printIt(v interface{}) {
fmt.Println(v) // こんにちは
}
- 上記のソースコードを実行するとコンソールに「こんにちは」が表示されます。
Type Assertion
func main() {
var a interface{} = 1
i := a
j := a.(int)
println(i) // ①
println(j) // ②
}
- aとiはDynamic typeです。値は1です。
- jはint型で値は1です。
- ①:ポインターアドレスが出力されます。
- ②:1が出力されます。
