contentGoでUnion型/直和型をいい感じに表現する方法GoTL;DR直和型を実装するのではなく、(型の)パターンマッチの方を実装します。型のパターンマッチはクロージャーを使って以下のように表現できます。String型だった場合の処理})そもそもUnion型/直和型とはUnion型/直和型とはどちらか片方の型の値を取るような型のことで典型的には以下のような構文で表現されます。Stringこの機能を持っている言語としては静的型付け関数型言語(Haskell/OCaml/F#)、強力な型機能のある言語(Rust/TypeScript)などがあります。Goを使っていても、"複数の型を取りうる型"を考えたくなることがあり、この場合よくやられている方法として次のようなものがあると思います。型のswitch文を使う以下のようなvalue.(type)を使った書き方はよく見られます。v}ここでの問題はvalueをinterface{}として扱う必要があり、型による保証を受けられず型安全ではありません。structを使う型を要素として含むようなstructを作るやり方もよく見られます。string}この方法の問題点は不整合な値が許容されることです。具体的には複数のフィールドに非ゼロな値が入ってしまうことが可能で、こうなってしまうともやは直和型の値とは呼べません。"hoge",}また、元となる型のzero-valueをどう表現するのかという問題もあります。直和型を利用する際には、パターンマッチを使って元の型を取り出して処理しますが、このような処理を実装することを考えます。具体的には以下のようなパターンマッチを表現するメソッドMatchを持った型(インターフェイス)を考えます。Match(Cases)}メソッドMatchに渡す構造体Casesは、各型で行う処理を収めた構造体です。func(String)}構造体Casesに処理内容を入れて組み立て、メソッドMatchを呼び出すことで各型ごとの処理へとディスパッチすることができます。String型だった場合の処理})IntStringUnionを構成する元の型、IntとStringは以下のように定義します。この定義により、それぞれIntStringUnionのインターフェイスを満たすことに注意してください。IntStringUnionインターフェイスの実装IntとString共にIntStringUnionのインターフェイスを満たすので、以下のような表現が可能となります。Int(4)}全体のコードの例は以下のようになります。上記のIntStringUnionインターフェイスの実装だと例えばCase.Intがnilの場合ランタイムエラーが起きるので、以下のような実装のほうがより安全でしょう。upLoginユーザーは見つかりませんでした。