基于 Golang Go语言泛型实现的简单容器

发布于 1周前 作者 caililin 来自 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

6 回复

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 结构体,并为其添加了 AddPrintAll 方法。通过实例化不同类型的 Container,我们可以轻松存储和打印不同类型的数据。这展示了 Go 泛型在简化代码和增强代码复用性方面的强大功能。

回到顶部