golang 研发学习之路之泛型

golang在1.18.x版本中,已经支持了泛型,从代码实现上看,整体在使用上比较简洁,但是如果结合面型对象思想做一些常见数据结构开发的时候,就会遇到各种各样的问题,该文将现以 队列 和 链表 两个数据结构还说明泛型的使用,相关代码我会放在github中。 github.com/xiezy1997/g...

如何在func中使用泛型?

  • 原始的func书写形式
go 复制代码
func Sum(a, b int) int {
	return a + b
}
  • 泛型的func书写形式
go 复制代码
func Sum[T int64 | float64](a, b T) T {
	return a + b
}

通过代码对比我们就可以看出,泛型是在funcName后面增加了一个T,用来表示T的类型,那么我们在调用的时候,既可以显示告知方法类型,也可让方法自动识别类型是否匹配。

  • 调用方法
go 复制代码
fmt.Println(Sum[int64](a, b))
fmt.Println(Sum(c, d))

定义泛型的时候一定要枚举所有类型吗?

当然是不需要的啦,golang内置了一些约束,也可以自定义一些约束,以简化代码书写

  • 内置约束
内置约束 注意事项
any 实则interface{}
comparable 必须支持"=="方法
  • 自定义约束
go 复制代码
type Int interface {
	int | int8 | int16 | int32 | int64
}

func Sum[T Int](a, b T) T {
	return a + b
}

如何在struct中使用泛型?

go 复制代码
type LinkList[T any] struct {
	head *node[T]
	tail *node[T]
	cnt  int
}
type node[T any] struct {
	data T
	next *node[T]
}

其实我们将泛型应用在struct中也是十分简单的,只要我们在structName后面加上T即可在struct使用了,但是需要注意我们在创建这个struct对象的时候,需要显示指定这个T实际类型n := &node[int]{}

如何在接口中使用泛型?

go 复制代码
type IMath[T any] interface {
	Sum(a, b T) T
}

在interface中,我们也是只需要在interfaceName后面加上T即可使用泛型了

如何在常见数据结构中使用泛型呢?

其实我们只需要将struct、interface、func以及泛型整合到一起,即可实现在数据结构中使用泛型,具体可以看 github.com/xiezy1997/g...,此处仅放一个方法作为demo

go 复制代码
// interface.go
type ILinkList[T any] interface {
	// Iterator 获取迭代器函数
	//  @param ctx
	//  @return func() (T, bool): data, isNull
	Iterator(ctx context.Context) func() (T, bool)
}

// linklist.go
type LinkList[T any] struct {
	head *node[T]
	tail *node[T]
	cnt  int
}
func (l *LinkList[T]) Iterator(ctx context.Context) func() (T, bool) {
	p := l.head // 此处使用闭包的特性,实现迭代器操作
	return func() (T, bool) {
		if p == nil {
			var t T // 这里不能直接返回nil,一旦T不是指针的话,返回nil会出现panic,所以此处需要先创建其变量再返回
			return t, true
		}
		data := p.data
		p = p.next
		return data, false
	}
}
func NewLinkList[T any]() ILinkList[T] {
	return &LinkList[T]{}
}

// types.go
type node[T any] struct {
	data T
	next *node[T]
}

func newNode[T any]() *node[T] {
	return &node[T]{}
}
相关推荐
踏着七彩祥云的小丑4 小时前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go
止语Lab8 小时前
Go 代码生成的三层认知:从忍住不用到自己造轮子
go
协享科技9 小时前
AI 视频理解:让 Agent 看视频并总结内容
人工智能·go·音视频·agent·ai编程
曲幽1 天前
掏出手机就能搭个 WebDAV 同步服务器?这操作有点香
go·termux·tampermonkey·sync·webdav·filebrowser·gowebdav·koreader
Code_Artist2 天前
🦜用 GoAI 从零打造一个 AI Agent 脚手架工程:重新定义智能体开发范式!
go·agent·ai编程
ShuiShenHuoLe2 天前
OS的常用函数
go
踏着七彩祥云的小丑2 天前
Go学习第8天:接口 + 泛型 + 错误处理
开发语言·学习·golang·go
蓝宝石的傻话3 天前
rpi-cam:给 Raspberry Pi 造的轻量级 ONVIF 相机服务
go·iot·nvr
蓝宝石的傻话3 天前
VictoriaMetrics指标流聚合三年回顾与现状(2026)
go·prometheus·victoriametrics
踏着七彩祥云的小丑3 天前
Go学习第7天:Map集合 + 递归函数 + 类型转换
开发语言·学习·golang·go