Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compile error: cannot use res (type []chan x) as type []<-chan x in return argument #40010

Closed
scorsi opened this issue Jul 2, 2020 · 3 comments
Closed

Comments

@scorsi
Copy link

@scorsi scorsi commented Jul 2, 2020

What version of Go are you using (go version)?

$ go version
go version go1.14.4 darwin/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/scorsi/Library/Caches/go-build"
GOENV="/Users/scorsi/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/scorsi/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.14.4/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.14.4/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/ld/l11ndr2d3xsclhqxbjjhmkbw0000gn/T/go-build147800266=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

Check it out on play.golang.org

The code is as simple as that:

func myFunc() []<-chan int {
	var res []chan int
	return res
}

What did you expect to see?

When we don't use a slice, returning a receive-only channel works. Example:

func myFunc() <-chan int {
	var res chan int
	return res
}

Why it'sn't the case for slice of chan ?

What did you see instead?

A compile error.

@ianlancetaylor
Copy link
Contributor

@ianlancetaylor ianlancetaylor commented Jul 3, 2020

That is how the language works. The fact that you can assign chan int to <-chan int doesn't mean that you can assign []chan int to []<-chan int. The language rules are documented at https://golang.org/ref/spec#Assignability .

@scorsi
Copy link
Author

@scorsi scorsi commented Jul 3, 2020

Thanks for your comment, how could I achieve this ? By recreating another slice of channels in receive-only mode ? Could go infer the type here to avoid that ?

@ajr360
Copy link

@ajr360 ajr360 commented Sep 28, 2020

@scorsi I found this issue as I have exactly the same problem. The only way around it that I found was to create a new slice and copy the elements from the []chan int to the []<-chan int one at a time, in a loop. Of course, this is ugly, slow (for a slice of millions of chans) and add a lot of unnecessary strain on the GC. I suggest you make a language change proposal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants
You can’t perform that action at this time.