分享一个简单的 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

8 回复

限制并发的话,一个 chan 就可以了吧

更多关于分享一个简单的 Golang Go语言泛型实践小项目的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


chan 自然可以,Go 限制并发的基本都是基于 chan 的。在很多地方用到的话,慢慢就会想着复用,最终还是会演进成一个协程池的模样。

就 3 行,不至于变成协程池吧…

method 上不支持额外 type parameter 实在是太限制了

是的,Go 这种有反射的语言,要做泛型,用类型擦除是比较简单的,但是性能差点。现在的实现是基于模版的,支持 method type param 感觉比较难。

简单梳理下,可能的演进方向

https://gist.github.com/zhenzou/21f4f1e585105540050f14c8e5cd5d6a

简单使用 chan 当然能运行,只是应该可以有更好用的 API 而已。

这么看起来确实更简洁了

当然,很高兴分享一个简单的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的泛型特性来创建一个通用的容器数据结构。通过使用泛型,我们可以编写更加灵活和可重用的代码。你可以根据需要扩展这个项目,比如添加更多的容器操作(删除、查找等)。

回到顶部