Go でジェネリックを使用して異なる構造体の共有フィールドを処理するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-29 04:51:02
オリジナル
950 人が閲覧しました

How to Handle Shared Fields in Different Structs with Generics in Go?

ジェネリックを使用した異なる構造体の共有フィールドの処理

外部パッケージを使用する場合、共通のメンバーを含む構造体で動作するジェネリック関数を定義するのが難しい場合があります。この記事では、2 つの異なる Firebase メッセージ構造体 MessageMulticastMessage の共有フィールドを変更する汎用関数を作成しようとした問題について説明します。

Android 構成フィールドと同様に、これらの構造体には明示的な関係がなく、型パラメーターを使用して共通プロパティに直接アクセスしようとするとエラーが発生します。この理由は、リンクされたスレッドで説明されているように、Go 1.18 は型パラメータの共通フィールドまたはメソッドへのアクセスをまだサポートしていないためです。

解決策のオプション

この問題に対処するには、いくつかの解決策があります。提案:

1. Type 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 MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}</code>
ログイン後にコピー

ジェネリック関数は、この共通メソッドにアクセスできます:

<code class="go">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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!