问题:
目标是定义一个通用函数,可以修改不同 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中文网其他相关文章!