Go言語で union とか直和型のようなデータを表現したいときは interface を使う
たとえば Haskell では以下のようなデータ型を定義できます。
data Tree = Leaf | Branch Tree Tree
C言語で言えばタグ付き共用体(union)のような感じです。
この記事は、こんな感じで木構造などを表現したい時
Go 言語ではどうするのか?という点について調べてみたメモです。
結論としてはtype Tree interface{ ... }
を定義します。
data Tree a
のように汎用的なコンテナを作る方法については言及しません。
Leaf と Branch に対して行いたい操作
ここではTree
中のLeaf
を数えるCount
という関数を考えてみます。
Haskell だったらパターンマッチで分岐です。
count :: Tree -> Int
count Leaf = 1
count (Branch l r) = count l + count r
今Go言語で実現したいのは以下のような内容です。
Leaf
かBranch
のどちらかのデータ構造を引数に取るLeaf
かBranch
かによって処理を分岐する
そこで登場するのが interface
です。
ここでLeaf
とBranch
はcount
という共通のインタフェースを持っているわけなので、
そういうふうに書きます。
そんなわけでコードは以下の通りです。
まとめ
ということでGo言語で木構造のような直和型のデータ構造を扱う小さな例を示しました。