Description
Go version
go1.23 and go tip
Output of go env
in your module/workspace:
n/a, using go.dev/play
What did you do?
https://go.dev/play/p/-psvliJDE_j
package main
import "fmt"
// Constraint to allow function to operate on a channel,
// regardless of the channel's directionality.
type channelConstraint[T any] interface {
chan T | <-chan T | chan<- T
}
func main() {
var sendOnlyCh chan<- string = make(chan string)
printCap(sendOnlyCh)
// Needs to be:
printCap[string](sendOnlyCh)
var receiveOnlyCh <-chan int = make(chan int, 1)
printCap(receiveOnlyCh)
// Needs to be:
printCap[int](receiveOnlyCh)
bidiCh := make(chan any)
printCap(bidiCh)
// Needs to be:
printCap[any](bidiCh)
}
// printCap prints the capacity of ch,
// regardless of ch's directionality.
func printCap[T any, C channelConstraint[T]](ch C) {
fmt.Println(cap(ch))
}
I want to write a small utility that takes a specific action that is determined by a channel's length and/or capacity. In this codebase, there are a general mix of directional and bidirectional channels. I thought I would be able to write a constraint such that my helper can accept a channel of any directionality. And I can indeed write that constraint, but when I call a function with that constraint, I have to provide the channel's element type as a type parameter in order to get the program to compile.
I am surprised that I have to provide the channel's element type, but maybe I am missing something about constraints or generics.
What did you see happen?
./prog.go:13:10: in call to printCap, cannot infer T (prog.go:28:15)
What did you expect to see?
I expected that printCap(ch)
would compile; that I would not have to write printCap[int](ch)
.
I tried searching the issues for variations of "constraints", "channels", and "direction" or "directionality" but I was not able to find any issues that looked similar.
Metadata
Metadata
Assignees
Type
Projects
Status