LinkbalDay 15

golangでinterfaceを実装してみる


はじめに

この記事はLinkbal Advent Calendar 2018の15日目の記事です。

何を書くか悩んだのですが、最近golangでinterfaceの実装をする機会があり、ちょっと調べたことがあったので、ここへ記事にすることにしました。


実装する内容


  • 図形の面積を計算するものです。(例は三角形と長方形のみ)

  • 三角形と長方形の構造体を定義します。

  • interface(Calculator)には、面積を計算するメソッド(calculate)を定義し、定義した構造体のメソッドとして実装します。


コード


sample.go

ackage main

import "fmt"

// 計算メソッドを定義するinterface
type Calculator interface {
calculate() int
}

// 三角形の構造体
type triangle struct {
base, height int
}

// 長方形の構造体
type rectangle struct {
height, width int
}

// 三角形の面積を計算する
func (t triangle) calculate() int {
return t.base * t.height / 2
}

// 長方形の面積を計算する
func (r rectangle) calculate() int {
return r.height * r.width
}

// Calculator typeを引数として各構造体の計算メソッドを呼び出す
func calculate(calc Calculator) int {
return calc.calculate()
}

func main() {
// 初期化
t := triangle{base: 10, height: 10}
r := rectangle{height: 10, width: 10}

// 計算
fmt.Println("triangle", t.calculate())
fmt.Println("rectangle", r.calculate())

// 同じinterface(Calculator)を実装しているので
// 同じtypeで扱うことができる
calcSlice := []Calculator{t, r}
for _, c := range calcSlice {

// switchで元のtypeに戻せる
switch v := c.(type) {
case triangle:
fmt.Printf("%T", v)
case rectangle:
fmt.Printf("%T", v)
}

fmt.Println(c.calculate())
}

//構造体を直接して、計算を実行する
fmt.Println("triangle", calculate(t))
fmt.Println("rectangle", calculate(r))
}


実行結果

triangle 50

rectangle 100
---------------------------
main.triangle50
main.rectangle100
---------------------------
triangle 50
rectangle 100


おわりに

いかがでしたでしょうか。golangは書き方シンプルでわかりやすいですね。

弊社ではエンジニア採用を強化しております。

golangの他に、RubyやPython、PHPなども利用しています。

ご興味ある方は、ぜひこちらからお問い合わせください。こちら