言語がネイティブにユニオンをサポートしていないため、Go ではユニオンは物議を醸すトピックです。ただし、ユニオンが必要な状況は数多くあるため、開発者はこの制限を回避する創造的な方法を見つける必要があります。
一般的なアプローチの 1 つは、次のようなコンテナ構造体を作成することです。共用体で表現されるさまざまな型を保持します。たとえば、コメント、処理命令、または空白を含む XML 構造の場合、次のようにコンテナ構造体を定義できます。
type Misc struct { value interface {} }
この構造体は、3 つのタイプのいずれかを保持するために使用できます。
func MiscComment(c *Comment) *Misc { return &Misc{c} } func MiscProcessingInstruction (pi *ProcessingInstruction) *Misc { return &Misc{pi} } func MiscWhiteSpace (ws *WhiteSpace) *Misc { return &Misc{ws} }
Misc 構造体に格納される値の型を決定するには、述語を次のようにします。使用:
func (m Misc) IsComment () bool { _, itis := m.value.(*Comment) return itis } func (m Misc) IsProcessingInstruction () bool { _, itis := m.value.(*ProcessingInstruction) return itis } func (m Misc) IsWhiteSpace () bool { _, itis := m.value.(*WhiteSpace) return itis }
ゲッターを使用して、正しく型指定された要素を取得できます:
func (m Misc) Comment () *Comment { return m.value.(*Comment) } func (m Misc) ProcessingInstruction () *ProcessingInstruction { return m.value.(*ProcessingInstruction) } func (m Misc) WhiteSpace () *WhiteSpace { return m.value.(*WhiteSpace) }
このアプローチは、シミュレートする方法を提供します。共用体では、型安全性は提供されません。タイプセーフを実現するには、何かを Misc としてマークするインターフェイスを作成することを検討できます:
type Misc interface { ImplementsMisc() } type Comment Chars func (c Comment) ImplementsMisc() {} type ProcessingInstruction func (p ProcessingInstruction) ImplementsMisc() {}
この方法では、Misc オブジェクトのみを処理する関数を作成でき、特定のタイプを後で決定できます。
>ただし、Go でユニオンを模倣するには、安全でないコードを避けるために慎重な実装が必要であることに注意することが重要です。型安全性が優先される場合は、ポリモーフィズムやジェネリックなどの代替アプローチを検討する必要があります。
以上がGo でユニオンを効果的にシミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。