卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35525本站已运行397

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

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

PHP中的类型约束是一种强大的功能,它允许我们在函数或方法的参数中定义所接受的参数类型。不仅仅局限于基本数据类型,PHP也允许我们为自定义的类、接口、数组和可迭代对象定义类型约束。在本文中,我们将通过php小编草莓为您介绍如何为任何通道类型定义类型约束,以便更好地控制和保护我们的代码。无论您是初学者还是有经验的开发者,这些技巧都将帮助您提高代码的可读性和可维护性。

问题内容

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

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://www.php.cn/link/ca279b8542ab30bd43469423ce703e66

卓越飞翔博客
上一篇: 当我发送“GET”请求时,在 Golang 中返回“404 页面未找到”
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏