Go 1.19.2泛型问题:如何为泛型指针创建的变量设置ID值
解决Go泛型结合GORM删除操作的字段设置问题
问题根源
你的代码报错核心原因是:
- 泛型约束
T ModelC仅限制T是ModelC或嵌入ModelC的值类型,但指针类型*T与*ModelC并非同一类型,无法直接调用*ModelC定义的接收器方法 - 结构体嵌入的方法提升需要结合泛型约束的正确声明才能被编译器识别
方案一:直接访问嵌入字段(最简单)
由于ModelC的Id是导出字段(大写开头),且所有泛型类型都嵌入了ModelC,可以直接通过指针访问嵌入字段的Id来赋值:
func DeleteGenericById[T ModelC](id int) error { tPtr := new(T) // 直接设置嵌入的ModelC的Id字段 tPtr.ModelC.Id = id _, err := Delete(tPtr) return err }
方案二:通过接口约束实现方法调用
如果需要用方法封装Id设置逻辑,可以调整泛型约束,确保*T能识别到提升的setId方法:
- 保留原有的
IModelC接口和setId方法 - 修改泛型约束为
T ~ModelC(~表示所有与ModelC结构兼容的类型,包括嵌入它的类型)
type IModelC interface { setId(id int) } func (m *ModelC) setId(id int) { m.Id = id } func DeleteGenericById[T ~ModelC](id int) error { tPtr := new(T) // *T因嵌入ModelC,自动提升setId方法,可直接调用 tPtr.setId(id) _, err := Delete(tPtr) return err }
补充说明
- 方案一无需额外接口或方法,利用Go结构体嵌入的字段访问特性,代码更简洁高效
- 方案二更适合需要统一Id设置逻辑的场景,确保所有模型类型的Id设置行为一致
内容的提问来源于stack exchange,提问作者RJLyders
相关产品推荐
相关产品推荐

