外部パッケージの構造体メンバー用の汎用関数
さまざまな Firebase メッセージ構造体に特定のフィールドを追加する単一の関数を作成するという目標を考えてみましょう。 Message や MulticastMessage など、同様のタイプの共通フィールドを共有します。最初は、次のように型制約を使用してジェネリック関数 highPriority を定義しようとすると、エラーが発生しました:
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &messaging.AndroidConfig{...} return message }</code>
Go 1.18 の制限
Go 1.18 では、型パラメータの共通フィールドまたはメソッドはサポートされていません。したがって、このアプローチは失敗します。
解決策 1: 型スイッチ
共用体の限られた数の型については、型スイッチを利用できます。
<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 1.18 でジェネリックを使用してさまざまな Firebase メッセージ構造体にフィールドを設定するにはどうすればよいですか? * 遺伝子の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。