Go语言 如何为任何通道类型定义类型约束

ruoxqz4g  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(81)

我试图定义一个函数,返回给定通道的使用百分比:

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的签名。但是如果我改变签名,我需要选择只接收或只发送信道。有没有一种方法可以定义一个零向通道?例如,不能读取也不能写入,我只是想在上面使用caplen函数。理想情况下,ChannelUsagePct应该适用于3种情况中的任何一种。

kupeojn6

kupeojn61#

为了允许所有三种可能的通道形式,需要定义单独的类型约束。

type Chan[T any] interface {
    chan T | <-chan T | chan<- T
}

字符串
这将需要在使用时使用T类型示例化类型约束,这可以通过另一个类型参数来完成:

func Cap[T any, C Chan[T]](c C) int {
    return cap(c)
}


由于该示例化,不能推断整个类型,而只需要提供channel元素类型:

ch := make(chan int, 3)
i := Cap[int](ch)
fmt.Println(i)
// 3


https://go.dev/play/p/1lx5R4MFvFx

相关问题