分享一个简单的 Golang Go语言泛型实践小项目
https://github.com/zhenzou/executors
Go 泛型快发布了,就想着练练手。
虽然现在主要用 Go 了,但是还是怀念 Java 的一些东西,所以封装了一个协程池,提供一个类似 Java 的线程池的 API ,支持 future ,callback ,能够异步转同步等。
一般情况下,其实用不上协程池,但是在需要限制并发的场景下还是有用处的,新入坑的同学可以参考参考这个项目。
吐槽一下,Go 泛型不支持 method type param ,限制实在太大了。 虽然也可以通过 func type param 转一下,但是确实还是太丑。
本来准备把 CompletableFuture 的 API 实现下,但是不支持 method type param 组合起来不好看,就参考 JS 简单提供一个 then ,catch API 了。
分享一个简单的 Golang Go语言泛型实践小项目
更多关于分享一个简单的 Golang Go语言泛型实践小项目的实战教程也可以访问 https://www.itying.com/category-94-b0.html
限制并发的话,一个 chan 就可以了吧
更多关于分享一个简单的 Golang Go语言泛型实践小项目的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
chan 自然可以,Go 限制并发的基本都是基于 chan 的。在很多地方用到的话,慢慢就会想着复用,最终还是会演进成一个协程池的模样。
就 3 行,不至于变成协程池吧…
method 上不支持额外 type parameter 实在是太限制了
是的,Go 这种有反射的语言,要做泛型,用类型擦除是比较简单的,但是性能差点。现在的实现是基于模版的,支持 method type param 感觉比较难。
这么看起来确实更简洁了
当然,很高兴分享一个简单的Golang泛型实践小项目。
泛型实践小项目:容器(Container)
项目描述
这个项目的目标是实现一个通用的容器数据结构,可以存储任意类型的元素。通过使用Go 1.18引入的泛型特性,我们可以避免为每种类型编写单独的容器实现。
代码示例
package main
import (
"fmt"
)
// 定义一个泛型容器结构
type Container[T any] struct {
elements []T
}
// 添加元素到容器中
func (c *Container[T]) Add(element T) {
c.elements = append(c.elements, element)
}
// 获取容器中的所有元素
func (c *Container[T]) GetAll() []T {
return c.elements
}
func main() {
// 创建一个存储整数的容器
intContainer := Container[int]{}
intContainer.Add(1)
intContainer.Add(2)
fmt.Println(intContainer.GetAll()) // 输出: [1, 2]
// 创建一个存储字符串的容器
strContainer := Container[string]{}
strContainer.Add("Hello")
strContainer.Add("World")
fmt.Println(strContainer.GetAll()) // 输出: [Hello, World]
}
总结
这个简单的项目展示了如何使用Go的泛型特性来创建一个通用的容器数据结构。通过使用泛型,我们可以编写更加灵活和可重用的代码。你可以根据需要扩展这个项目,比如添加更多的容器操作(删除、查找等)。