Golang – Interface

今回は、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が出力されます。

参考

예제로배우는 Go 프로그래밍

コメントを残す