首頁  >  文章  >  後端開發  >  以下是一些標題選項,每個標題選項都強調文章的不同面向: 聚焦問題: * 如何在 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>

方案三:反射

對於結構體較多的場景,可以使用反射:

<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)。
  • 關於實現聯合約束類型的通用方法的詳細信息,請訪問[Go泛型中,如何使用聯合約束類型的通用方法? ](https://go.dev/play/p/JUHp9Fu27Yt ).

以上是以下是一些標題選項,每個標題選項都強調文章的不同面向: 聚焦問題: * 如何在 Go 1.18 中使用泛型設定不同 Firebase 訊息結構中的欄位? * 基因的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn