ホームページ > バックエンド開発 > Golang > Go でユニオンを効果的にシミュレートするにはどうすればよいですか?

Go でユニオンを効果的にシミュレートするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-13 07:04:11
オリジナル
259 人が閲覧しました

How Can I Effectively Simulate Unions in Go?

Go におけるユニオンのベスト プラクティス

言語がネイティブにユニオンをサポートしていないため、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート