問題:
目標是定義一個通用函數,可以修改不同 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 }
註解:
以上是泛型函數可以跨套件修改不相關結構中的共享欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!