首頁 > 後端開發 > Golang > 泛型函數可以跨套件修改不相關結構中的共享欄位嗎?

泛型函數可以跨套件修改不相關結構中的共享欄位嗎?

DDD
發布: 2024-10-27 10:20:03
原創
1030 人瀏覽過

 Can Generic Functions Modify Shared Fields in Unrelated Structs Across Packages?

泛型函數可以跨外部套件結構使用共享成員嗎?

問題:

目標是定義一個通用函數,可以修改不同 Firebase 訊息結構中的特定欄位。儘管具有類似類型的重疊字段,但 Message 和 MulticastMessage 結構缺乏顯式關係。但是,嘗試使用介面約束來處理此問題會引發錯誤。

解決方案 1:類型切換

如果聯合中的類型數量較少,則類型切換方法可以工作。這涉及手動處理每種類型並調用適當的方法來設定所需的欄位值。

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
}
登入後複製

解決方案2:使用方法進行包裝

另一種解決方案涉及包裝原始結構體並在包裝器中定義可用於設定共享字段的通用方法。

type wrappedMessage interface {
    *MessageWrapper | *MultiCastMessageWrapper
    SetConfig(c foo.Config)
}

type MessageWrapper struct {
    messaging.Message
}

func (w *MessageWrapper) SetConfig(cfg messaging.Android) {
    *w.Android = cfg
}
登入後複製

解決方案 3:反射

用於處理較大的結構體的數量,可以使用反射來動態設定共用欄位。但是,請注意,這需要結構體和欄位是可尋址的。

func highPriority[T firebaseMessage](message T) T {
    cfg := &messaging.Android{} 
    reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg))
    return message
}
登入後複製

註解:

  • 解決方案 2 提供了最大的靈活性並允許類型安全性。
  • 解決方案 3 是一種更通用的方法,但需要反射,並且可能會產生效能開銷。

以上是泛型函數可以跨套件修改不相關結構中的共享欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板