如何定义适配所有Go通道类型的泛型类型约束?
适配三种通道类型的使用率计算函数解决方案
你定义的ChannelUsagePct函数目前仅支持双向通道,无法适配单向发送/接收通道,这是因为Go的通道类型带有方向区分,双向通道不能直接与单向通道互相赋值作为泛型参数。不过可以通过泛型类型约束实现适配三种通道的需求,无需定义所谓“无方向”通道类型。
实现方案
通过定义一个包含所有通道类型的泛型约束,让函数接受任意方向的通道:
package main import "fmt" // 定义约束,覆盖双向、发送、接收三种通道类型 type Channel[T any] interface { ~chan T | ~chan<- T | ~<-chan T } func ChannelUsagePct[T any, C Channel[T]](channel C) int { channelCap := cap(channel) channelLen := len(channel) if channelCap == 0 { // 无缓冲通道返回0 return 0 } return 100 * channelLen / channelCap } func main() { twoWayChannel := make(chan int, 10) var sendOnlyChannel chan<- int = twoWayChannel var recvOnlyChannel <-chan int = twoWayChannel // 现在三种通道都能正常调用 fmt.Println(ChannelUsagePct(twoWayChannel)) fmt.Println(ChannelUsagePct(sendOnlyChannel)) fmt.Println(ChannelUsagePct(recvOnlyChannel)) }
原理说明
~chan T表示所有底层类型为双向通道的类型,同理~chan<- T和~<-chan T覆盖单向发送、接收通道;- 泛型约束
Channel[T]限定了参数只能是这三种通道类型,而内置函数cap()和len()对这三种类型都有效,因此函数内部逻辑无需修改; - 调用时编译器会自动推导类型,无需手动指定泛型参数。
内容的提问来源于stack exchange,提问作者Pablo Matias Gomez
相关产品推荐
相关产品推荐

