如何为任何通道类型定义类型约束
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 签名的情况下,这适用于第一个通道,但不适用于第二个和第三个通道。但如果我更改签名,我需要选择仅接收或仅发送的通道。有没有办法定义零路通道?例如。无法读取或写入,我只想在其上使用 cap
和 len
函数。
理想情况下,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
以上就是如何为任何通道类型定义类型约束的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341