ホームページ  >  記事  >  バックエンド開発  >  以下にいくつかのタイトルのオプションを示します。それぞれが記事の異なる側面を強調しています。 問題に焦点を当てる: * Go 1.18 でジェネリックを使用してさまざまな Firebase メッセージ構造体にフィールドを設定するにはどうすればよいですか? * 遺伝子

以下にいくつかのタイトルのオプションを示します。それぞれが記事の異なる側面を強調しています。 問題に焦点を当てる: * Go 1.18 でジェネリックを使用してさまざまな Firebase メッセージ構造体にフィールドを設定するにはどうすればよいですか? * 遺伝子

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 20:32:01720ブラウズ

Here are a few title options, each highlighting a different aspect of the article:

Focusing on the problem:

* How to Set Fields in Different Firebase Message Structs with Generics in Go 1.18?
* Generic Function for Struct Members from External Packages:

外部パッケージの構造体メンバー用の汎用関数

さまざまな Firebase メッセージ構造体に特定のフィールドを追加する単一の関数を作成するという目標を考えてみましょう。 Message や MulticastMessage など、同様のタイプの共通フィールドを共有します。最初は、次のように型制約を使用してジェネリック関数 highPriority を定義しようとすると、エラーが発生しました:

<code class="go">type firebaseMessage interface {
    *messaging.Message | *messaging.MulticastMessage
}

func highPriority[T firebaseMessage](message T) T {
    message.Android = &amp;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 := &amp;messaging.Android{}
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}</code>

追加メモ:

  • 型パラメーターの制限の詳細については、[インターフェースの構造体フィールドを型制約として定義するにはどうすればよいですか?](https://go.dev/play/p/9iG0eSep6Qo) を参照してください。
  • 共用体制約内の型の共通メソッドの実装の詳細については、「In Go ジェネリックス、共用体制約内の型に共通のメソッドを使用する方法?」(https://go.dev/play/p/JUHp9Fu27Yt) を参照してください。 ).

以上が以下にいくつかのタイトルのオプションを示します。それぞれが記事の異なる側面を強調しています。 問題に焦点を当てる: * Go 1.18 でジェネリックを使用してさまざまな Firebase メッセージ構造体にフィールドを設定するにはどうすればよいですか? * 遺伝子の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。