go的泛型

简单例子,把传入的int类型的数据,打印出来,然后返回前两位数值

func forSclice(slice []int) []int {
	for i, v := range slice {
		fmt.Println(i, v)
	}
	return slice[:2]
}

如果该方法,支持任何形式的入参呢?

func forSclice[T any](slice []T) []T {
	for i, v := range slice {
		fmt.Println(i, v)
	}
	return slice[:2]
}

能支持任何形式,显然不合理,修改一下,只支持 intfloat32

func forSclice[T int | float32](slice []T) []T {
	for i, v := range slice {
		fmt.Println(i, v)
	}
	return slice[:2]
}

image
可以使用如下方法,正常调用

	s := forSclice([]int{1, 2, 3, 4, 5})
	s2 := forSclice([]float32{1.0, 2.0, 3.0, 4.0, 5.0})

补充一点,其实完整的调用,应该是如下的格式,只不过,go能自动推导出来数据格式,所以此处,不需要再在方法名后声明

	s := forSclice[int]([]int{1, 2, 3, 4, 5})
	s2 := forSclice[float32]([]float32{1.0, 2.0, 3.0, 4.0, 5.0})

如上使用|来声明的方法,比较麻烦的话,可以使用自定义接口来实现

type MyType interface {
	// 注意,这个接口和普通结构不同,只能声明类型,不能声明方法
	int | float32
}

func forSclice[T MyType](slice []T) []T {
	for i, v := range slice {
		fmt.Println(i, v)
	}
	return slice[:2]
}

你也可以进行如下声明,MyInt 是基于int定义的新类型,如果让该泛型,支持此类型。有两种功法

  1. 在泛型声明的接口中,声明此类型,例如MyFloat
  2. 使用 ~int,便能自动识别基于 MyInt 这个基于 int 的新类型
type MyInt int
type MyFloat float32

type MyType interface {
	// 注意,这个接口和普通结构不同,只能声明类型,不能声明方法
	~int | float32 | MyFloat
}

posted @ 2025-09-23 23:27  沧海一声笑rush  阅读(14)  评论(0)    收藏  举报