Go での共用体の処理: ベスト プラクティスの調査
Go には組み込みの共用体タイプがないため、特定のシナリオでは欠点となる可能性があります。たとえば、XML のユニオンの使用を扱う場合、Go 開発者は代替ソリューションを見つける必要があります。
一般的なアプローチの 1 つは、ユニオンを構成できるさまざまな型を保持するコンテナ構造体を作成することです。ただし、このアプローチでは、冗長な関数やメソッドでコードが肥大化する可能性があります。
この記事では、Go で共用体を処理するより良い方法があるかどうかを検討します。
現在の解決策: 冗長コード
XML のその他の非終端をモデル化する例を考えてみましょう。コメント、処理命令、または空白。コンテナ構造体を使用してこのユニオンの Go コードを実装するには、各型のコンストラクター、ゲッター、述語を記述する必要があります。
type Misc struct { value interface{} } func MiscComment(c *Comment) *Misc { return &Misc{c} } func MiscProcessingInstruction(pi *ProcessingInstruction) *Misc { return &Misc{pi} } func MiscWhiteSpace(ws *WhiteSpace) *Misc { return &Misc{ws} } func (m Misc) IsComment() bool { _, ok := m.value.(*Comment); return ok } func (m Misc) Comment() *Comment { return m.value.(*Comment) }
このソリューションは冗長で反復的です。 Go によくある単純さと優雅さが欠けています。
代替アプローチ
型スイッチ:
Volker が型を提案しました実行可能な代替案として switch:
switch v := m.value.(type) { case *Comment: // Type-assert v if needed // ... }
型が切り替わる間反復コードは削減されますが、コンパイラによる型安全性がまだ欠けています。
インターフェイス マーキング:
潜在的な解決策は、何かを Misc 要素として識別するインターフェイスを作成することです。
type Misc interface { ImplementsMisc() } type Comment Chars func (c Comment) ImplementsMisc() {} type ProcessingInstruction func (p ProcessingInstruction) ImplementsMisc() {}
このアプローチにより、Misc オブジェクトのみを処理する関数の作成が可能になり、型強制が可能になります。実行時:
func myFunc(m Misc) { switch m := m.(type) { case Comment: // Type-assert m if needed // ... } }
考察と結論
Go には組み込みの共用体型がないにもかかわらず、これらの代替アプローチは共用体を処理するためのソリューションを提供します。コンテナ構造体のアプローチは Java スタイルのユニオンを複製しますが、より多くのコーディング作業が必要になります。型切り替えのアプローチはより単純で、実行時に共用体を処理しますが、型の安全性は低下します。最後に、インターフェイスのアプローチは、型の安全性とコードの単純さの間の妥協点を提供します。
どのアプローチが最も適しているかは、開発者が受け入れる特定の要件とトレードオフによって異なります。
以上がGo 開発者は、組み込みサポートなしでユニオンを効果的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。