基于 Golang Go语言泛型实现的简单容器
golang 1.18 有泛型之后,对业务代码的编写友好很多,可以更方便的实现一些不限类型的通用库。
最近尝试在 golang 中实现 ddd 的分层抽象,离不开注册和构建概念,如果没有泛型,那就需要很多强制业务代码中的类型转换代码,看起来不太优雅。
所以拿泛型实现了一个简单的容器,很方便解决了这个问题。
使用示例
package main
import “github.com/attson/container”
type Test struct {
Name string
}
func (t Test) Key() string {
return t.Name
}
type I interface {
Key() string
}
为结构体注册一个构建函数
// 为结构体注册一个构建函数
container.Register[Test](func() any {
return Test{
Name: "test",
}
})
// 通过容器构建实例
v1 := container.Make[Test]()
println(v1.Name) // test
为接口注册一个构建函数
// 为接口注册一个构建函数
container.Register[I](func() any {
return Test{
Name: "test_interface",
}
})
// 通过容器构建实例
v3 := container.Make[I]()
println(v3.Key()) // test_interface
在容器中设置一个接口实例
// 在容器中设置一个接口实例
container.Set[I](Test{
Name: "test_interface_set",
})
// 通过容器获取实例
v6 := container.Get[I]()
println(v6.Key()) // test_interface_set
使用起来简单了很多。(不讨论性能问题,ddd 问题)
代码实现也比较简单,有兴趣的可以看下,https://github.com/attson/container
基于 Golang Go语言泛型实现的简单容器
更多关于基于 Golang Go语言泛型实现的简单容器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
reflect.Type 可作 map key 的,不用转成 string
更多关于基于 Golang Go语言泛型实现的简单容器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可~我去试试
已修改成 reflect.Type ,感谢
这个容器的场景是什么呀 可以介绍一下嘛
emmm, 抽象与实现分离。比如获取一个 service<br>container.Get[service.CampaignService]().Execute(arg1)<br>
代码层面就可以有抽象 service 接口,和 service 实现,并且可以放在不同的包下。然后在一个统一的地方注册
针对您提到的基于 Golang Go 语言泛型实现的简单容器,这里提供一个简短而专业的回复:
在 Go 1.18 版本中,泛型(Generics)的引入为开发者提供了创建更通用、可重用代码的能力。利用这一特性,实现一个简单的容器变得既灵活又高效。
一个基本的容器可以看作是一个能够存储任意类型元素的集合。在 Go 中,通过定义泛型接口和结构体,我们可以创建一个能够容纳不同类型元素的通用容器。
例如,我们可以定义一个泛型切片类型来表示容器:
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]) PrintAll() {
for _, elem := range c.elements {
fmt.Println(elem)
}
}
func main() {
var intContainer Container[int]
intContainer.Add(1)
intContainer.Add(2)
intContainer.PrintAll()
var strContainer Container[string]
strContainer.Add("Hello")
strContainer.Add("World")
strContainer.PrintAll()
}
在这个示例中,我们定义了一个泛型 Container
结构体,并为其添加了 Add
和 PrintAll
方法。通过实例化不同类型的 Container
,我们可以轻松存储和打印不同类型的数据。这展示了 Go 泛型在简化代码和增强代码复用性方面的强大功能。