首頁  >  文章  >  後端開發  >  如何編寫通用函數來處理 Go 中外部套件中具有公共成員的結構?

如何編寫通用函數來處理 Go 中外部套件中具有公共成員的結構?

Linda Hamilton
Linda Hamilton原創
2024-10-27 09:49:30949瀏覽

How to Write a Generic Function for Handling Structs with Common Members from an External Package in Go?

用於處理具有外部包中的公共成員的不同結構體的通用函數

簡介

編寫通用函數來操作共享公共成員的多個結構體可能具有挑戰性,特別是當這些結構屬於外部套件時。本文探討了解決此場景的各種解決方案。

問題定義

考慮編寫一個在 Firebase 訊息結構(包括 Message 和 MulticastMessage)中加入特定欄位的函數。這兩個結構體都包含相同類型的 Android 和 APNS 字段,但它們沒有明確聲明彼此之間的關係。

嘗試和錯誤

最初,人們可能會嘗試定義一個通用介面firebaseMessage ,並以下列方式實作該函數:

<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>

但是,由於錯誤「message .Android undefined (type T has no field or method Android)”,此方法失敗。

解決方案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)
}

type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}

// same for MulticastMessageWrapper</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>

請注意,由於此方法使用反射,因此必須確保欄位可定址。

結論

根據具體要求,適當的解決方案可能會大不相同。本文提供了幾種在 Go 中處理此類場景的可行選項。

以上是如何編寫通用函數來處理 Go 中外部套件中具有公共成員的結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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