What version of Go, VS Code & VS Code Go extension are you using?
Version Information
* Run `go version` to get version of Go from _the VS Code integrated terminal_. - go version go1.22.2 linux/amd64 * Run `gopls -v version` to get version of Gopls from _the VS Code integrated terminal_. - golang.org/x/tools/gopls v0.15.3 golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o= github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y= golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4= golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak= golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= go: go1.22.2 * Run `code -v` or `code-insiders -v` to get version of VS Code or VS Code Insiders. - 1.88.1 * Check your installed extensions to get the version of the VS Code Go extension - v0.41.2 * Run Ctrl+Shift+P (Cmd+Shift+P on Mac OS) > `Go: Locate Configured Go Tools` command. ## Environment GOBIN: undefined toolsGopath: gopath: /root/go GOROOT: /usr/local/go PATH: /root/.vscode-server/bin/e170252f762678dec6ca2cc69aba1570769a5d39/bin/remote-cli:/usr/local/go/bin:/root/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin:/root/.local/bin ## Tools go: /usr/local/go/bin/go: go version go1.22.2 linux/amd64 gopls: /root/go/bin/gopls (version: v0.15.3 built with go: go1.22.2) gotests: /root/go/bin/gotests (version: v1.6.0 built with go: go1.22.2) gomodifytags: /root/go/bin/gomodifytags (version: v1.16.0 built with go: go1.22.2) impl: /root/go/bin/impl (version: v1.1.0 built with go: go1.22.2) goplay: /root/go/bin/goplay (version: v1.0.0 built with go: go1.22.2) dlv: /root/go/bin/dlv (version: v1.22.1 built with go: go1.22.2) staticcheck: /root/go/bin/staticcheck (version: v0.4.7 built with go: go1.22.2) ## Go env Workspace Folder (server): GO111MODULE='' GOARCH='amd64' GOBIN='' GOCACHE='/root/.cache/go-build' GOENV='/root/.config/go/env' GOEXE='' GOEXPERIMENT='' GOFLAGS='' GOHOSTARCH='amd64' GOHOSTOS='linux' GOINSECURE='' GOMODCACHE='/root/go/pkg/mod' GONOPROXY='' GONOSUMDB='' GOOS='linux' GOPATH='/root/go' GOPRIVATE='' GOPROXY='https://proxy.golang.org,direct' GOROOT='/usr/local/go' GOSUMDB='sum.golang.org' GOTMPDIR='' GOTOOLCHAIN='auto' GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64' GOVCS='' GOVERSION='go1.22.2' GCCGO='gccgo' GOAMD64='v1' AR='ar' CC='gcc' CXX='g++' CGO_ENABLED='1' GOMOD='/xxx/go.mod' GOWORK='' CGO_CFLAGS='-O2 -g' CGO_CPPFLAGS='' CGO_CXXFLAGS='-O2 -g' CGO_FFLAGS='-O2 -g' CGO_LDFLAGS='-O2 -g' PKG_CONFIG='pkg-config' GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build445704314=/tmp/go-build -gno-record-gcc-switches' Workspace Folder (web): GO111MODULE='' GOARCH='amd64' GOBIN='' GOCACHE='/root/.cache/go-build' GOENV='/root/.config/go/env' GOEXE='' GOEXPERIMENT='' GOFLAGS='' GOHOSTARCH='amd64' GOHOSTOS='linux' GOINSECURE='' GOMODCACHE='/root/go/pkg/mod' GONOPROXY='' GONOSUMDB='' GOOS='linux' GOPATH='/root/go' GOPRIVATE='' GOPROXY='https://proxy.golang.org,direct' GOROOT='/usr/local/go' GOSUMDB='sum.golang.org' GOTMPDIR='' GOTOOLCHAIN='auto' GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64' GOVCS='' GOVERSION='go1.22.2' GCCGO='gccgo' GOAMD64='v1' AR='ar' CC='gcc' CXX='g++' CGO_ENABLED='1' GOMOD='/xxx/go.mod' GOWORK='' CGO_CFLAGS='-O2 -g' CGO_CPPFLAGS='' CGO_CXXFLAGS='-O2 -g' CGO_FFLAGS='-O2 -g' CGO_LDFLAGS='-O2 -g' PKG_CONFIG='pkg-config' GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build300344583=/tmp/go-build -gno-record-gcc-switches'
Describe the bug
go 1.22 alredy fix the loop vairable issue, why waring "loop variable v captured by func literal loopclosure" (go.mod go version 1.22.2)
waring link https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/loopclosure
Steps to reproduce the behavior:
package main
import "fmt"
func main() {
elem := make([]string, 10)
for _, v := range elem {
go func() {
fmt.Println(v)
}()
}
}
Screenshots or recordings
Comment From: ansaba
I tried on go1.22.2 darwin/amd64 and the issue was not reproducible.
Comment From: timothy-king
Looks like the GoVersion is < 1.22.0 for the file. This value is derived from the go.mod file for the module, the build tags for the file, and the compiler version used to build gopls (and the -lang flag in some rare cases). The compiler version used to build gopls is >= 1.22 so that is not the issue.
What does the "go 1.XY" line say in the go.mod file? (Or is there no go.mod file?)
Comment From: synhi
Looks like the GoVersion is < 1.22.0 for the file. This value is derived from the go.mod file for the module, the build tags for the file, and the compiler version used to build gopls (and the -lang flag in some rare cases). The compiler version used to build gopls is >= 1.22 so that is not the issue.
What does the "go 1.XY" line say in the go.mod file? (Or is there no go.mod file?)
go.mod: go 1.22.2
Comment From: synhi
I tried on go1.22.2 darwin/amd64 and the issue was not reproducible.
try this command
go clean -cache -modcache
then Run Ctrl+Shift+P (Cmd+Shift+P on Mac OS) > Go: Install/Update Tools command and select all options
I use vscode remote-ssh extension to connect a linux server
Comment From: ohheydom
I'm seeing the same issue. Looks like a possible regression -> https://github.com/golang/go/issues/65910. gopls
0.15.2 works without issue.
Following the same steps from that issue:
gopls version
Build info
----------
golang.org/x/tools/gopls v0.15.3
golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o=
github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=
golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak=
golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=
honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=
mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
go: go1.22.2
go env
GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/dominic/Library/Caches/go-build'
GOENV='/Users/dominic/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/dominic/go/pkg/mod'
GONOPROXY='gitlab.morningconsult.com'
GONOSUMDB='gitlab.morningconsult.com'
GOOS='darwin'
GOPATH='/Users/dominic/go'
GOPRIVATE='gitlab.morningconsult.com'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.22.2'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/dominic/Projects/loopclosure/go.mod''
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/r3/5ch28yq55hv_8fk9bd_7jdnm0000gn/T/go-build1471649584=/tmp/go-build -gno-record-gcc-switches -fno-common'
What did you do?
With the following main.go:
package main
import (
"fmt"
)
func main() {
for i := range 10 {
go func() { fmt.Println(i) }()
}
}
and go.mod
module example.com/loopclosure
go 1.22.2
I ran
gopls check main.go
What did you see happen?
/Users/dominic/Projects/sandbox/main.go:9:27-28: loop variable i captured by func literal
What did you expect to see?
No error message
Comment From: findleyr
Thanks, yes this is a regression in gopls@v0.15.3, specifically this CL: https://go.dev/cl/576678
That code should be comparing language versions, not toolchain versions :(
Fix incoming. To disable this analysis in the meantime: "analyses": { "loopclosure": false }
Comment From: findleyr
Aha, we didn't catch this because it isn't broken at master. The problem is that gopls-release-branch.0.15 lacks https://go.dev/cl/567635.
Comment From: findleyr
Closing as this has been cherry-picked to the release branch, and we are preparing the v0.15.4 release. The release branch was fixed in https://go.dev/cl/579758 (the issue number was wrong in that CL, which is why it wasn't associated here).
Comment From: 0xBradock
@synhi suggestion worked for me.
I am using nvim:
- Updated
gopls
with:Mason
+U
- Ran
go clean -cache -modcache
- Then,
go mod tidy
- Finally, restarted my nvim lsp
:LspRestart
I did everything apart from 2
and it failed. It was only after that command that it solved for me
Hope it helps
Comment From: findleyr
Thanks @0xBradock. For what it's worth, steps (2) and (3) should not be necessary. Simply updating gopls to the latest version and restarting should fix the problem.