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]:创建类型别名,共享方法集
  • 类型嵌入:通过组合继承方法

对于泛型类型,使用类型别名(=)或类型嵌入是最直接的解决方案,可以保持方法集的完整性。

回到顶部