我试图定义一个函数,返回给定通道的使用百分比:
func ChannelUsagePct[T any](channel chan T) int {
channelCap := cap(channel)
channelLen := len(channel)
if channelCap == 0 {
// Unbuffered channel
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)) // Does not work
fmt.Println(ChannelUsagePct(recvOnlyChannel)) // Does not work
}
字符串
现在的问题是,这适用于第一个通道,但不适用于第二个和第三个通道,而不改变func的签名。但是如果我改变签名,我需要选择只接收或只发送信道。有没有一种方法可以定义一个零向通道?例如,不能读取也不能写入,我只是想在上面使用cap
和len
函数。理想情况下,ChannelUsagePct
应该适用于3种情况中的任何一种。
1条答案
按热度按时间kupeojn61#
为了允许所有三种可能的通道形式,需要定义单独的类型约束。
字符串
这将需要在使用时使用
T
类型示例化类型约束,这可以通过另一个类型参数来完成:型
由于该示例化,不能推断整个类型,而只需要提供channel元素类型:
型
https://go.dev/play/p/1lx5R4MFvFx