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
以上是如何为任何通道类型定义类型约束的详细内容。更多信息请关注PHP中文网其他相关文章!