來自外部套件的結構成員的通用函數
考慮建立單一函數以將特定欄位新增至不同的Firebase 訊息結構的目標,例如Message 和MulticastMessage,它們共享相似類型的公共欄位。最初,嘗試使用型別約束定義泛型函數highPriority 時產生了錯誤:
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &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 := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }</code>
補充說明:
以上是以下是一些標題選項,每個標題選項都強調文章的不同面向: 聚焦問題: * 如何在 Go 1.18 中使用泛型設定不同 Firebase 訊息結構中的欄位? * 基因的詳細內容。更多資訊請關注PHP中文網其他相關文章!