当涉及通过通道将数据发送到 goroutine 进行进一步处理时,需要一个可以处理任何类型的通道类型经常出现。随着 Go 1.18 中泛型的引入,这样的挑战似乎是可以应对的。然而,有一个问题:在初始化时为 goroutine 指定通道类型仍然是一个障碍,因为它可以保存任何数据类型。
为了解决此问题,请考虑以下示例代码:
type Message[T any] struct { Data T } type Packet[T any] struct { Msg Message[T] } func StartController[T any](sender chan Packet[T]) { go runThread(sender) } func runThread[T any](sender chan Packet[T]) { for true { data := <-sender fmt.Println(data) } }
在这段代码中,StartController 函数启动了一个执行 runThread 函数的 goroutine。但是,由于尝试在没有实例化的情况下使用泛型类型 Packet[T interface{}],因此会出现编译错误。
一个常见的误解是使用泛型创建可以容纳任何类型的通道。与 Java 的 List
举个例子,考虑 Java 的泛型收集器 ArrayList
c := make(chan interface{})
在这种情况下,通道可以接受任何类型的数据。然而,问题出现了:通用通道应该如何处理接收操作?如果可以向其中发送任何内容,那么接收到的项目的数据类型是什么?
因此,最合适的解决方案仍然是 chan interface{},并在接收到项目时进行类型断言,就像代码中没有实现的那样泛型。
相反,泛型的真正价值在于编写处理任意类型的代码,同时保持类型安全。例如:
func receiveAny[T any](c chan T) T { return <-c }
可以使用 chan int 或 chan 字符串调用此函数。
以上是如何使用 Go 泛型创建处理不同运行时类型的类型安全通道?的详细内容。更多信息请关注PHP中文网其他相关文章!