Go言語で union とか直和型のようなデータを表現したいときは interface を使う
公開日: today タグ:
go

たとえば 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言語で実現したいのは以下のような内容です。

  • LeafBranchのどちらかのデータ構造を引数に取る
  • LeafBranchかによって処理を分岐する

そこで登場するのが interface です。 ここでLeafBranchcountという共通のインタフェースを持っているわけなので、 そういうふうに書きます。

そんなわけでコードは以下の通りです。

まとめ

ということでGo言語で木構造のような直和型のデータ構造を扱う小さな例を示しました。