如何合并字段结构一致仅类型不同的Go结构体TodoUpdateLog与TodoUpdateRequest?
基于泛型合并Go结构体的可行方案
完全可以通过你定义的泛型结构体TodoUpdate[T any]来合并这两个模型,核心思路是将包装类型(Range/Optional)作为泛型参数传入,而非把字段的原始类型作为泛型参数。具体实现步骤如下:
1. 保留原有的Range和Optional泛型包装
假设你的Range[T]和Optional[T]定义类似:
// 示例Range包装类型,可根据实际逻辑调整 type Range[T any] struct { OldValue T `json:"old_value"` NewValue T `json:"new_value"` } // 示例Optional包装类型,可根据实际逻辑调整 type Optional[T any] struct { Value T `json:"value"` Present bool `json:"present"` }
2. 重构泛型结构体TodoUpdate
将泛型参数改为接受包装类型,字段使用该包装类型包裹对应原始类型,同时保留原有JSON标签:
// TodoUpdate 泛型结构体,Wrapper为包装类型(Range/Optional) type TodoUpdate[Wrapper any] struct { Title Wrapper[string] `json:"title"` Description Wrapper[string] `json:"description"` Status Wrapper[int] `json:"status"` // 其他字段保持与原结构体一致... }
3. 替代原有的两个结构体
原来的TodoUpdateLog和TodoUpdateRequest无需重复定义,直接通过泛型实例化即可:
// 替代原TodoUpdateLog type TodoUpdateLog = TodoUpdate[Range] // 替代原TodoUpdateRequest type TodoUpdateRequest = TodoUpdate[Optional]
注意事项
- 确保
Range[T]和Optional[T]支持JSON序列化/反序列化,如果有自定义逻辑,需各自实现json.Marshaler和json.Unmarshaler接口。 - 后续若需扩展新的包装类型,只需新增包装结构体,再通过
TodoUpdate[NewWrapper]实例化即可,无需修改泛型结构体本身。
内容的提问来源于stack exchange,提问作者user5096676
相关产品推荐
相关产品推荐

