Golang不支持泛型typedef间接类型的问题讨论
Golang不支持泛型typedef间接类型的问题讨论
考虑以下代码,函数 Init 无法被识别。
无法像其他语言(例如 C++)那样简化类型定义。
type List[T any] struct {
next *List[T]
val T
}
func (o *List[T]) Init(a int){
fmt.Printf(" %+v %v",*o,a)
}
type list8 List[uint8]
func main() {
var a list8
a.val = 12
a.Init(17)
}
3 回复
尝试
type list8 = List[uint8]
更多关于Golang不支持泛型typedef间接类型的问题讨论的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,现在我在规范中看到有两种定义类型别名和新类型的方法。
这是一个Go语言泛型类型别名(type alias)的典型限制。问题在于list8是一个新类型,它不会继承List[uint8]的方法集。
问题分析
在Go中,当你使用type list8 List[uint8]时,你创建了一个全新的类型,而不是类型别名。这个新类型不会自动获得原始类型的方法。
解决方案
方案1:使用类型嵌入(推荐)
type List[T any] struct {
next *List[T]
val T
}
func (o *List[T]) Init(a int) {
fmt.Printf(" %+v %v", *o, a)
}
// 使用类型嵌入而不是类型定义
type list8 struct {
List[uint8]
}
func main() {
var a list8
a.val = 12 // 可以直接访问嵌入字段的字段
a.Init(17) // 现在可以调用Init方法
}
方案2:定义方法包装器
type List[T any] struct {
next *List[T]
val T
}
func (o *List[T]) Init(a int) {
fmt.Printf(" %+v %v", *o, a)
}
type list8 List[uint8]
// 为list8定义包装方法
func (o *list8) Init(a int) {
(*List[uint8])(o).Init(a)
}
func main() {
var a list8
a.val = 12
a.Init(17)
}
方案3:使用类型转换
type List[T any] struct {
next *List[T]
val T
}
func (o *List[T]) Init(a int) {
fmt.Printf(" %+v %v", *o, a)
}
type list8 List[uint8]
func main() {
var a list8
a.val = 12
// 通过类型转换调用方法
(*List[uint8])(&a).Init(17)
}
方案4:使用真正的类型别名(Go 1.9+)
type List[T any] struct {
next *List[T]
val T
}
func (o *List[T]) Init(a int) {
fmt.Printf(" %+v %v", *o, a)
}
// 使用等号创建类型别名(不是新类型)
type list8 = List[uint8]
func main() {
var a list8
a.val = 12
a.Init(17) // 现在可以正常工作
}
关键区别
type list8 List[uint8]:创建新类型,不继承方法type list8 = List[uint8]:创建类型别名,共享方法集- 类型嵌入:通过组合继承方法
对于泛型类型,使用类型别名(=)或类型嵌入是最直接的解决方案,可以保持方法集的完整性。

