gpt4 book ai didi

使用不同运行时类型的通用容器

转载 作者:行者123 更新时间:2023-12-05 00:52:42 25 4
gpt4 key购买 nike

我目前正在尝试通过 channel 将数据发送到 goroutine,然后它会进一步处理它。我的问题是我希望 channel 能够使用任何类型。为此,我正在研究 Go 1.18 中新引入的泛型。

我的问题是我需要在启动 goroutine 时告诉它 channel 是什么类型,这是不可能的,因为它可以保存任何数据。

这是我现在得到的:

线程:

func StartController[T any](sender chan Packet[T]) {
go runThread(sender)
}

func runThread[T any](sender chan Packet[T]) {
fmt.Println("in thread")
for true {
data := <- sender

fmt.Println(data)
}
}

我的测试函数是这样的:

func main() {
sender := make(chan Packet)

StartController(sender)

sender <- Packet[int]{
Msg: Message[int]{
Data: 1,
},
}

sender <- Packet[string]{
Msg: Message[string]{
Data: "asd",
},
}

for true {}
}

类型:

type Message[T any] struct {
Data T
}

type Packet[T any] struct {
Msg Message[T]
}

目前这段代码无法编译,因为

.\test.go:8:22: cannot use generic type Packet[T interface{}] without instantiation

有没有办法正确地做到这一点?

我正在考虑不使用泛型而只使用 interface{} 作为类型,但这会使整个逻辑变得困惑,因为它需要解析(甚至可能不可能,因为数据可能相当复杂(嵌套结构) )

最佳答案

这是使用泛型的错误方式。

参数化类型,如 chan T必须先用具体的类型参数实例化,然后才能使用它。给定一个已定义的 chan 类型:

type GenericChan[T any] chan T

您仍然需要使用具体类型对其进行实例化:

c := make(GenericChan[int])

这使得使用类型参数有点没有意义。

我不知道您的背景是什么,但请考虑一下泛型长期以来一直稳定存在的语言。例如。 java 。并考虑典型的 Java 通用收集器 List<T> .你通常做的是用一个类型实例化它:

var list = new ArrayList<String>(); 

您在这里尝试做的是声明一个可以采用任何类型的 channel 。在 Java 中,什么是可以容纳任何类型的列表?

var list = new ArrayList<Object>(); 

在 Go 中,这不过是

c := make(chan interface{})

您可以换个角度看待它:您希望这个通用 chan 如何处理 receive 操作?

c := make(GenericChan) // wrong syntax: instantiating without type param
c <- "a string" // let's pretend you can send anything into it

// ...

foo := <-c

此时 foo 是什么? ?是string ?或 int ?您可以将任何内容发送到其中。这就是为什么像您的示例中这样的通用 chan 无法按您想要的方式工作。必须是 chan interface{}然后你像现在一样在没有泛型的情况下键入断言收到的项目。

泛型的重点是编写使用任意类型的代码,同时保持类型安全:

func receiveAny[T any](c chan T) T {
return <-c
}

您可以调用chan intchan string .

关于使用不同运行时类型的通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69485180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com