LoginSignup
8
6

More than 5 years have passed since last update.

Golang interfaceの使い方

Last updated at Posted at 2015-11-16

ここを参考にした。

立方体と長方形の面積(体積)を求めるとする。

package main

import "fmt"

type Rectangle struct {
    length, width int
}

type Cube struct {
    side int
}

func (r Rectangle) Area() int {
    return r.length * r.width
}

func (c Cube) Area() int {
    return c.side * c.side * c.side
}

func main() {
    rect := Rectangle{length: 5, width: 3}
    fmt.Println("Rectangle is ", rect)
    fmt.Println("Area is ", rect.Area())
    cb := Cube{side: 3}
    fmt.Println("Cube is ", cb)
    fmt.Println("Area is ", cb.Area())
}

Areaを定義して、それぞれ面積(体積)を計算してやった。

Rectangle is  {5 3}
Area is  15
Cube is  {3}
Area is  27

もう少し抽象化してみる。 Shaper という interface を作ってやって

Shaper(変数).Area()

で変数を放り込めば面積が出るようにしてやる。

package main

import "fmt"

type Shaper interface {
    Area() int
}

type Rectangle struct {
    length, width int
}

type Cube struct {
    side int
}

func (r Rectangle) Area() int {
    return r.length * r.width
}

func (c Cube) Area() int {
    return c.side * c.side * c.side
}

func main() {
    rect := Rectangle{length: 5, width: 3}
    fmt.Println("Rectangle is ", Shaper(rect))
    fmt.Println("Area is ", Shaper(rect).Area())
    cb := Cube{side: 3}
    fmt.Println("Cube is ", Shaper(cb))
    fmt.Println("Area is ", Shaper(cb).Area())
}

出た。

Rectangle is  {5 3}
Area is  15
Cube is  {3}
Area is  27

これでいったい何すんの?と思ったが、どうもこれで、「図形の面積(体積)をだす」という計算が抽象化出来たわけだ。

ということはfunc main()内をもっと簡略化できる。
体積(面積)を出したい図形を配列に入れてイテレーションさせてみる。

func main() {
    rect := Rectangle{length: 5, width: 3}
    cb := Cube{side: 3}
    arr := []Shaper{rect, cb}

    for _, value := range arr {
        fmt.Println("Area is ", value.Area())
    }
}
Area is  15
Area is  27

出た。

追加

この記事はとても参考になる

インタフェースの実装パターン #golang
http://qiita.com/tenntenn/items/eac962a49c56b2b15ee8

急いで学ぶGo lang#6 インターフェイス
http://dev.classmethod.jp/go/golang-6/

8
6
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
8
6