【发布时间】:2021-11-27 18:47:06
【问题描述】:
我目前正在尝试通过通道将数据发送到 goroutine,然后它会进一步处理它。我的问题是我希望频道能够使用任何类型。为此,我正在研究 Go 1.18 中新引入的泛型。
我的问题是我需要在启动 goroutine 时告诉它通道将是什么类型,这是不可能的,因为它可以保存任何数据。
这是我现在得到的:
线程:
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{} 作为类型,但这会使整个逻辑变得混乱,因为它需要解析(甚至可能不可能,因为数据可能相当复杂(嵌套结构) )
【问题讨论】: