Go言語では様々な形でダックタイピングが可能です。 今回はGo言語で利用可能な返り値の型指定を利用する例を紹介します。

 1``go
 2package main
 3
 4import (
 5	"fmt"
 6	"errors"
 7)
 8
 9func main() {
10	robot, err1 := GetDuck("robot")
11	if err1 == nil {
12		robot.Quack()
13	}
14	
15	human, err2 := GetDuck("human")
16	if err2 == nil {
17		human.Quack()
18	}
19}
20
21func GetDuck (ducktype string) (Duck, error) {
22	if ducktype == "human" {
23		return Human{}, nil
24	} else if ducktype == "robot" {
25		return Robot{}, nil
26	}
27	
28	return nil, errors.New("正しいタイプを選んでね")
29}
30
31type Duck interface {
32	Quack()
33}
34
35type Robot struct {}
36
37func (r Robot) Quack () {
38	fmt.Println("Q-U-A-C-K")
39}
40
41type Human struct {}
42
43func (h Human) Quack () {
44	fmt.Println("がーがー")
45}

GetDuck()関数を通して構造体を取得することで、Human型とRobot型をDuck型として扱う事ができました。

個人的に最近使ったケースはOAuth1とOAuth2の認証部分を別々の構造体として実装し、呼び出し部分でGetDuck()の関数のようにOAuth型として取得し、コントローラ側から見たときにOAuth型としてOAuthのバージョンを意識しなくても良いような実装を行ってみたりしていました。