登录
首页 >  Golang >  Go问答

为各种通道类型添加类型约束

来源:stackoverflow

时间:2024-02-17 16:24:23 342浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《为各种通道类型添加类型约束》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

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

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 种情况中的任何一种。


正确答案


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

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)
}

由于实例化,无法推断整个类型,而只需要提供通道元素类型:

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

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>