Home > Backend Development > Golang > How to define type constraints for any channel type

How to define type constraints for any channel type

WBOY
Release: 2024-02-13 09:40:09
forward
883 people have browsed it

How to define type constraints for any channel type

Type constraints in PHP are a powerful feature that allow us to define the accepted parameter types in the parameters of a function or method. Not only limited to basic data types, PHP also allows us to define type constraints for custom classes, interfaces, arrays and iterable objects. In this article, we will introduce you how to define type constraints for any channel type to better control and protect our code. Whether you're a beginner or an experienced developer, these tips will help you make your code more readable and maintainable.

Question content

I'm trying to define a function that returns the usage percentage of a given channel:

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 
}
Copy after login

Now the problem is that without changing the func signature this works for the first channel but not for the second and third channels. But if I change the signature I need to choose the channel to receive only or send only. Is there a way to define a zero-path channel? For example. Can't read or write, I just want to use the cap and len functions on it. Ideally, channelusagepct should work in any of these 3 cases.

Workaround

To allow all three possible forms of channels, separate type constraints need to be defined.

type chan[t any] interface {
    chan t | <-chan t | chan<- t
}
Copy after login

This requires instantiating the type constraint with a type of t when using it, which can be done using another type parameter:

func cap[t any, c chan[t]](c c) int {
    return cap(c)
}
Copy after login

Due to instantiation, the entire type cannot be inferred, but only the channel element type needs to be provided:

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

https://www.php.cn/link/ca279b8542ab30bd43469423ce703e66

The above is the detailed content of How to define type constraints for any channel type. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template