首页 > 后端开发 > 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板