为何*DataTo无法满足ToType[any]?Go语言DTOer构建疑问
问题原因分析
你遇到的问题核心是Go泛型接口约束的实例化不匹配:
- 你定义的
ToType[T any]接口约束包含两个部分:要求类型实现SetVal()方法,同时类型必须是*T(即指向T的指针)。 - 当你在
DTO中指定TTo ToType[any]时,这要求TTo必须是*any类型且实现SetVal()方法,但*DataTo和*any是完全不同的类型(*any是指向空接口的指针,而*DataTo是指向具体结构体的指针),因此*DataTo无法满足这个约束。
修正方案
根据你的需求,以下两种方式可以解决问题:
方式一:简化接口约束(推荐)
直接将ToType定义为非泛型接口,只要求类型实现SetVal()方法,匹配你需要目标类型能调用SetVal()的核心需求:
package main import "fmt" type DataFrom struct { V1 int } type DataTo struct { V int } func (m *DataTo) SetVal() { m.V = 1 } // 简化为非泛型接口,仅约束SetVal方法 type ToType interface { SetVal() } type DTO[TFrom any, TTo ToType] struct { Get func(from TFrom) TTo } func main() { dto := &DTO[DataFrom, *DataTo]{ Get: func(from DataFrom) *DataTo { return &DataTo{V: from.V1 + 666} }, } vFrom := DataFrom{V1: 1} vTo := dto.Get(vFrom) fmt.Println(vTo.V) // 输出667 vTo.SetVal() fmt.Println(vTo.V) // 输出1 }
方式二:保留泛型接口的关联约束
如果你需要明确约束TTo是某个结构体的指针,可以调整DTO的泛型参数,让TTo与ToType的泛型参数关联:
package main import "fmt" type DataFrom struct { V1 int } type DataTo struct { V int } func (m *DataTo) SetVal() { m.V = 1 } // 泛型接口约束:类型是*T且实现SetVal type ToType[T any] interface { SetVal() *T } // DTO新增TToInner参数,关联ToType的泛型参数 type DTO[TFrom any, TToInner any, TTo ToType[TToInner]] struct { Get func(from TFrom) TTo } func main() { dto := &DTO[DataFrom, DataTo, *DataTo]{ Get: func(from DataFrom) *DataTo { return &DataTo{V: from.V1 + 666} }, } vFrom := DataFrom{V1: 1} vTo := dto.Get(vFrom) fmt.Println(vTo.V) // 输出667 vTo.SetVal() fmt.Println(vTo.V) // 输出1 }
内容的提问来源于stack exchange,提问作者rene marxis
相关产品推荐
相关产品推荐

