ジェネリックを使用した共通のメンバーを使用したさまざまな構造体の操作
Go では、上で動作するジェネリック関数を作成するシナリオに遭遇することがあります。共通のメンバーを共有するさまざまな構造体。ただし、共用体型制約を越えてこのような共通フィールドに直接アクセスすることは、Go 1.18 ではまだサポートされていません。
チャレンジ:
2 つのメッセージ構造体、Message と MulticastMessage を考えてみましょう。 Android など、同じタイプのフィールド。これらのフィールドを両方の構造体に追加する汎用関数を定義したいと考えています。ただし、両方の構造体を含むインターフェイスに制約された型パラメータを使用すると、それらの共通フィールドに直接アクセスできなくなります。
解決策:
解決策 1: 型Switch
関連する構造体が少数しかない場合は、型スイッチを使用できます。
<code class="go">func highPriority[T firebaseMessage](message T) T { switch m := any(message).(type) { case *messaging.Message: setConfig(m.Android) case *messaging.MulticastMessage: setConfig(m.Android) } return message }</code>
解決策 2: メソッドを使用したラッパー
構造体の数が多い場合は、共通の機能を実装するメソッドで各構造体をラップすることを検討してください。
<code class="go">type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } func highPriority[T wrappedMessage](message T) T { message.SetConfig(messaging.Android{"some-value"}) return message }</code>
解決策 3: リフレクション
多くの構造体がある場合は、アドレス可能な構造体とフィールドが必要ですが、リフレクションの方が良い選択肢になる可能性があります:
<code class="go">func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }</code>
メモと代替案:
以上がジェネリックを使用して Go で共通のメンバーを持つ異なる構造体を操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。